Python numpy.search使用二维数组排序

Python numpy.search使用二维数组排序,python,arrays,search,numpy,Python,Arrays,Search,Numpy,我有一个numpy数组,其中每行中的值总是被排序并单调递增: a = np.array([[1, 2, 3, 4, 8], [2, 5, 6, 7, 8], [5, 7, 11, 12, 13]]) 我想为每一行搜索以下值(未排序或单调): b = np.array([4.5, 2.3, 11.6]) 所以我得到了一个答案: [4, 1, 3] 但是,searchsorted不支持这一点(它感觉需要一个axis关键字) 对于非常大的阵列,有没有一种有效的方法可以

我有一个numpy数组,其中每行中的值总是被排序并单调递增:

a = np.array([[1, 2, 3, 4, 8],
       [2, 5, 6, 7, 8],
       [5, 7, 11, 12, 13]])
我想为每一行搜索以下值(未排序或单调):

b = np.array([4.5, 2.3, 11.6])
所以我得到了一个答案:

[4, 1, 3]
但是,searchsorted不支持这一点(它感觉需要一个
axis
关键字)

对于非常大的阵列,有没有一种有效的方法可以做到这一点?显然,使用
for
循环,我可以像这样索引数组
a
b

for i in np.arange(np.alen(a)):
     print a[i].searchsorted(b[i])
但是当
a
较大时,这会很慢


在numpy中是否有更有效的方法执行此操作?

您可以在ravel/Flatten数组上搜索排序:

In [11]: np.searchsorted(a.ravel(), b)
Out[11]: array([3, 6])
然后,您可以对结果使用divmod(获取行和列):


这就要求每一行的值都比前一行的值大,这是OP的例子,但对于一般数组来说似乎是一个很好的条件。@Andy-这是问题中例子的一个优雅的解决方案,但正如Jamie所说,它不适用于b不是单调递增的情况。我已经更新了这个问题,使它更清楚。谢谢。@KernowBunney啊,好吧,这样做更有效,但类似于
np.diag(np.apply_沿_轴(np.searchsorted,1,a,b))
。对于for循环的性能来说,使用cython是一个简单的选择。@Andy Hayden-谢谢你-沿着轴应用,至少比Python循环更简洁/简洁。我会调查Cython的。干杯@而且,海登,沿轴应用是伟大的!为什么这个问题的分数是负数?
In [12]: divmod(np.searchsorted(a.ravel(), b), a.shape[1])
Out[12]: (array([0, 1]), array([3, 1]))