1

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

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 个元素。这需要大量的时间。你有什么建议可以加快速度吗?

4

2 回答 2

3

除了没有被矢量化之外,您当前的搜索是 (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)
于 2012-11-07T15:46:35.927 回答
0

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

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

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])
于 2012-11-07T15:32:30.793 回答