慕丝7291255
方法#1这是一个基于views. 利用np.argwhere( docs ) 返回满足条件的元素的索引,在本例中为成员资格。——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()-def argwhere_nd_argsort(a,b): A,B = view1D(a,b) c = np.r_[A,B] idx = np.argsort(c,kind='mergesort') cs = c[idx] m0 = cs[:-1] == cs[1:] return idx[:-1][m0],idx[1:][m0]-len(A)示例使用与之前相同的输入运行 -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]))