Python 匹配两个二维数组的行,并使用numpy获得行索引映射

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): #

假设您有两个二维数组A和B,并且您想检查B中包含A行的位置。 如何使用numpy最有效地实现这一点

例如

我知道如何使用inad()检查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]])