查找一个数组与另一个数组中所有值的最接近索引-PythonNumPy

查找一个数组与另一个数组中所有值的最接近索引-PythonNumPy,第1张

查找一个数组与另一个数组中所有值的最接近索引-Python / NumPy

这是一种

np.searchsorted
基于
thispost
-的矢量化方法

def closest_argmin(A, B):    L = B.size    sidx_B = B.argsort()    sorted_B = B[sidx_B]    sorted_idx = np.searchsorted(sorted_B, A)    sorted_idx[sorted_idx==L] = L-1    mask = (sorted_idx > 0) &     ((np.abs(A - sorted_B[sorted_idx-1]) < np.abs(A - sorted_B[sorted_idx])) )    return sidx_B[sorted_idx-mask]

简要说明 :

  • 获取左位置的排序索引。我们使用-

    np.searchsorted(arr1, arr2, side='left')
    或just进行此 *** 作
    np.searchsorted(arr1, arr2)
    。现在,
    searchsorted
    期望将排序数组作为第一个输入,因此我们需要在那里做一些准备工作。

  • 比较那些左侧位置的值和其紧邻右侧位置的值,

    (left + 1)
    看看哪一个最接近。我们在计算的步骤中执行此 *** 作
    mask

  • 根据左边的还是最右边的,选择相应的。这是通过对索引进行减法来完成的,将

    mask
    值作为偏移量转换为
    ints

标杆管理

原始方法-

def org_app(myArray, refArray):    out1 = np.empty(myArray.size, dtype=int)    for i, value in enumerate(myArray):        # find_nearest from posted question        index = find_nearest(refArray, value)        out1[i] = index    return out1

时间和验证-

In [188]: refArray = np.random.random(16)     ...: myArray = np.random.random(1000)     ...:In [189]: %timeit org_app(myArray, refArray)100 loops, best of 3: 1.95 ms per loopIn [190]: %timeit closest_argmin(myArray, refArray)10000 loops, best of 3: 36.6 µs per loopIn [191]: np.allclose(closest_argmin(myArray, refArray), org_app(myArray, refArray))Out[191]: True

50x+
加快发布的样本的速度,希望对更大的数据集有更多的速度!



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5667966.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存