类似的问题也有人问过,但没有一个答案完全符合我的需要--有些答案允许多维搜索(在matlab中又名“rows”选项)但不返回索引。有些返回索引但不允许行。我的数组非常大(1 M x 2),我已经成功地做了一个循环,但显然这是非常缓慢的。在matlab中,内置的ismember函数花费大约10秒。
这是我正在寻找的:
a=np.array([[4, 6],[2, 6],[5, 2]])
b=np.array([[1, 7],[1, 8],[2, 6],[2, 1],[2, 4],[4, 6],[4, 7],[5, 9],[5, 2],[5, 1]])
实现这个技巧的matlab函数是:
[~,index] = ismember(a,b,'rows')
其中
index = [6, 3, 9]
4条答案
按热度按时间2sbarzqh1#
印刷品
这相当于Matlab的[3,6,9],因为Python使用基于0的索引。
一些警告:
1.索引以升序返回,它们不对应于
a
项在b
中的位置。asvoid([-0.]) == asvoid([0.])
返回array([False])
。尽管有这些警告,但出于速度的考虑,还是可以选择使用
in1d_index
:因此
in1d_index
快了大约650倍(对于长度在千位以下的数组),但再次注意,这种比较并不完全是对等的,因为in1d_index
按升序返回索引,而ismember_rows
按a
的行在b
中显示的顺序返回索引。nsc4cvqm2#
列印
我用广播
正如联合国大学所述,指数是按升序返回的
gcxthw6b3#
该函数首先将多列元素转换为单列数组,然后可以使用numpy.in1d来查找所需的答案,请尝试以下代码:
ars1skjm4#
下面是一个基于libigl's
igl::ismember_rows
的函数,它非常接近Matlab的ismember(A,B,'rows')
的行为:例如,
生产