@Divakar提供的解决方案适用于整数数据,但是对于浮点数值的精度问题要小心,特别是如果它们跨越多个数量级(例如:
[[1.0, 2.0, 3.0, 1.0e + 20],...]
)。在某些情况下,
r
可能非常大,以至于应用
a+r
和
b+r
会抹掉您试图运行
searchsorted
的原始值,并且您只是将
r
与
r
进行比较。
为了使方法对浮点数据更加稳健,您可以将行信息作为值的一部分(作为结构化dtype)嵌入到数组中,并在这些结构化dtypes上运行searchsorted。
def searchsorted_2d (a, v, side='left', sorter=None):
import numpy as np
a = np.asarray(a)
v = np.asarray(v)
ai = np.empty(a.shape,dtype=[('row',int),('value',a.dtype)])
ai['row'] = np.arange(a.shape[0]).reshape(-1,1)
ai['value'] = a
vi = np.empty(v.shape,dtype=[('row',int),('value',v.dtype)])
vi['row'] = np.arange(v.shape[0]).reshape(-1,1)
vi['value'] = v
result = np.searchsorted(ai.flatten(),vi.flatten(), side=side, sorter=sorter)
result = result.reshape(vi.shape) - vi['row']*a.shape[1]
return result
编辑:这种方法的时机非常糟糕!
In [21]: %timeit searchsorted_2d(a,b)
10 loops, best of 3: 92.5 ms per loop
你最好只使用map
来处理数组:
In [22]: %timeit np.array(list(map(np.searchsorted,a,b)))
100 loops, best of 3: 13.8 ms per loop
对于整数数据,@Divakar的方法仍然是最快的:
In [23]: %timeit searchsorted2d(a,b)
100 loops, best of 3: 7.26 ms per loop