这是一种
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+
加快发布的样本的速度,希望对更大的数据集有更多的速度!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)