Python 匹配两个二维数组的行,并使用numpy获得行索引映射
假设您有两个二维数组A和B,并且您想检查B中包含A行的位置。 如何使用numpy最有效地实现这一点 例如 我知道如何使用inad()检查a的行是否在B中,但这并不能生成索引映射 此映射的目的是(最终)基于某些列将两个数组合并在一起。Python 匹配两个二维数组的行,并使用numpy获得行索引映射,python,arrays,pandas,numpy,merge,Python,Arrays,Pandas,Numpy,Merge,假设您有两个二维数组A和B,并且您想检查B中包含A行的位置。 如何使用numpy最有效地实现这一点 例如 我知道如何使用inad()检查a的行是否在B中,但这并不能生成索引映射 此映射的目的是(最终)基于某些列将两个数组合并在一起。 当然可以一行一行地做,但是效率很低,因为我的数组有这个形状(5000万,20) 另一种方法是使用,但我只想使用numpy 这是一个基于视图的视图。使用np.argwhere()返回满足条件(在本例中为成员资格)的元素的索引- def view1D(a, b): #
当然可以一行一行地做,但是效率很低,因为我的数组有这个形状(5000万,20) 另一种方法是使用,但我只想使用numpy 这是一个基于
视图的视图。使用np.argwhere
()返回满足条件(在本例中为成员资格)的元素的索引-
def view1D(a, b): # a, b are arrays
a = np.ascontiguousarray(a)
b = np.ascontiguousarray(b)
void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
return a.view(void_dt).ravel(), b.view(void_dt).ravel()
def argwhere_nd(a,b):
A,B = view1D(a,b)
return np.argwhere(A[:,None] == B)
方法#2
还有一个是O(n)
,因此性能更好,特别是在大型阵列上-
def argwhere_nd_searchsorted(a,b):
A,B = view1D(a,b)
sidxB = B.argsort()
mask = np.isin(A,B)
cm = A[mask]
idx0 = np.flatnonzero(mask)
idx1 = sidxB[np.searchsorted(B,cm, sorter=sidxB)]
return idx0, idx1 # idx0 : indices in A, idx1 : indices in B
方法#3
另一个O(n)
一个使用argsort()
-
使用与前面相同的输入运行示例-
In [650]: argwhere_nd_searchsorted(a,b)
Out[650]: (array([0, 1]), array([2, 0]))
In [651]: argwhere_nd_argsort(a,b)
Out[651]: (array([0, 1]), array([2, 0]))
您可以利用自动广播:
np.argwhere(np.all(a.reshape(3,1,-1) == b,2))
导致
array([[0, 2],
[1, 0]])
注意:对于浮点数,您可能希望将==
替换为np.islclose()
数组中的数字是整数吗?如果是,它们是积极的吗?如果是这样,它们是否有一个可以限制的范围?不幸的是,它们是浮动的,没有任何限制。在数组中是否可以有重复的(相同的行)?不,在我的情况下不是。
np.argwhere(np.all(a.reshape(3,1,-1) == b,2))
array([[0, 2],
[1, 0]])