使用void dtypes -
# https://stackoverflow.com/a/45313353/ @Divakar
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()
# https://stackoverflow.com/a/41242285/ @Andras Deak
def argsort_unique(idx):
n = idx.size
sidx = np.empty(n,dtype=int)
sidx[idx] = np.arange(n)
return sidx
A1D, B1D = view1D(A, B)
sidx = B1D.argsort()
out = argsort_unique(sidx)[np.searchsorted(B1D, A1D, sorter=sidx)]
示例运行 -
In [36]: # Let's take OP sample and shuffle them
# to make for a more generic sample case
...: A = np.array([[1 ,2, 3],[2, 2, 2],[1, 2, 3],[2, 3, 3],[2 ,2, 2],[2, 3, 3],[2 ,3 ,3]])
...: B = np.array([[1, 2, 3],[2, 2 ,2],[2 ,3, 3]])
...:
...: np.random.seed(0)
...: np.random.shuffle(B)
...: indx = np.array([0,1,0,2,1,2,2]) # we need to retrieve these
# as the desired o/p
...: A = B[indx]
In [37]: A
Out[37]:
array([[2, 3, 3],
[2, 2, 2],
[2, 3, 3],
[1, 2, 3],
[2, 2, 2],
[1, 2, 3],
[1, 2, 3]])
In [38]: B
Out[38]:
array([[2, 3, 3],
[2, 2, 2],
[1, 2, 3]])
In [39]: A1D, B1D = view1D(A, B)
...: sidx = B1D.argsort()
...: out = argsort_unique(sidx)[np.searchsorted(B1D, A1D, sorter=sidx)]
In [40]: out
Out[40]: array([0, 1, 0, 2, 1, 2, 2])