【问题标题】:Speed up minimum search in Numpy/Python加快 Numpy/Python 中的最小搜索速度
【发布时间】:2012-11-07 15:14:22
【问题描述】:

我有两个浮动数组,想找到在一定范围内匹配的数据点。 这是我到目前为止得到的:

import numpy as np

for vx in range(len(arr1)):
    match = (np.abs(arr2-arr1[vx])).argmin()
    if abs(arr1[vx]-arr2[match])<0.375:
        point = arr2[match]

问题在于 arr1 包含 150000 个元素,而 arr2 包含大约 110000 个元素。这需要大量的时间。您有什么加快速度的建议吗?

【问题讨论】:

标签: python numpy scipy


【解决方案1】:

除了没有被矢量化之外,您当前的搜索是 (n * m),其中 n 是 arr2 的大小,m 是 arr1 的大小。在这些类型的搜索中,它有助于对 arr1 或 arr2 进行排序,以便您可以使用二进制搜索。排序最终是最慢的一步,但如果 m 很大,它仍然更快,因为 n*log(n) 排序比 (n*m) 快。

以下是使用排序数组以矢量化方式进行搜索的方法:

def find_closest(A, target):
    #A must be sorted
    idx = A.searchsorted(target)
    idx = np.clip(idx, 1, len(A)-1)
    left = A[idx-1]
    right = A[idx]
    idx -= target - left < right - target
    return A[idx]

arr2.sort()
closest = find_closest(arr2, arr1)
closest = np.where(abs(closest - arr1) < .375, closest, np.nan)

【讨论】:

  • 为什么 searchsorted 不够?我不太了解 find_closest() 函数中发生了什么。不过效果很好!
  • 我写了一个更完整的解释 find_closest 如何在回答这个问题 stackoverflow.com/questions/8914491/… 中工作,但是 searchsorted 的原因是不够的,因为它返回了一个 target &lt;= A[index]。也就是说,如果你这样做searchsorted([0, 1], [0, .2, .9, 1.]) == [0, 1, 1, 1])。但是.2 更接近于 0 而不是 1 所以我们想要[0, 0, 1, 1]
【解决方案2】:

使用 numpy 的整个想法是避免使用循环进行计算。

指定条件以提取满足条件的新数组可以通过数组计算轻松实现。这是一个从数组a 中提取值的示例,它满足该元素与数组b 中的相应元素的绝对差异小于0.75 的条件:-

a = array([1, 0, 0.5, 1.2])

b = array([1.2, 1.1, 1.3, 1.4])

c = a[abs(a-b)<0.75]

这给了我们

array([ 1. ,  1.2])

【讨论】:

  • arr1arr2 在 HyperCube 的问题中是不同的大小,所以这不起作用。
  • 确实,不幸的是,两个数组都有不同的大小。记住这一点仍然很好。我想要实现的目标是找到导致相同大小数组的共同值。
猜你喜欢
  • 2023-01-05
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 2013-05-07
  • 1970-01-01
  • 2014-01-14
  • 2013-10-27
  • 1970-01-01
相关资源
最近更新 更多