python – 找到一个数组的哪些元素接近另一个数组中的任何元素的最有效方法是什么?

前端之家收集整理的这篇文章主要介绍了python – 找到一个数组的哪些元素接近另一个数组中的任何元素的最有效方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个1维numpy.ndarray对象,并想知道第一个数组中的哪些元素在第二个数组中的任何元素的dx内.

我现在拥有的是什么

  1. # setup
  2. numpy.random.seed(1)
  3. a = numpy.random.random(1000) # create one array
  4. numpy.random.seed(2)
  5. b = numpy.random.random(1000) # create second array
  6. dx = 1e-4 # close-ness parameter
  7.  
  8. # function I want to optimise
  9. def find_all_close(a,b):
  10. # compare one number to all elements of b
  11. def _is_coincident(t):
  12. return (numpy.abs(b - t) <= dx).any()
  13. # vectorize and loop over a
  14. is_coincident = numpy.vectorize(_is_coincident)
  15. return is_coincident(a).nonzero()[0]

返回timeit结果如下

  1. 10 loops,best of 3: 16.5 msec per loop

优化find_all_close函数的最佳方法是什么,特别是如果a和b保证是浮点数组,当它们传递给find_all_close时可能会以升序排序,可能是cython或类似的?

在实践中,我正在使用10,000到100,000个元素(或更大)的数组,并在几百个不同的b数组上运行整个操作.

解决方法

最简单的方法是对第一个数组中的每个元素,对第二个数组进行两次二进制搜索,以找到最多dx以下的元素,最多在第一个数组中的元素上方dx.这是线性时间:
  1. left = np.searchsorted(b,a - dx,'left')
  2. right = np.searchsorted(b,a + dx,'right')
  3. a[left != right]

线性算法有两个指向第二个数组的指针,它们在迭代第一个数组中的元素时跟踪移动窗口.

猜你在找的Python相关文章