伙计,自从np.unique 添加了axis 参数以来,我还没有机会链接到this 答案。感谢@Jaime
vview = lambda a: np.ascontiguousarray(a).view(np.dtype((np.void, a.dtype.itemsize * a.shape[1])))
基本上,这会将矩阵的“行”转换为行的原始数据流上的一维视图数组。这使您可以像比较单个值一样比较行。
那么就很简单了:
print(np.where(vview(x) == vview(z).T))
(array([0], dtype=int64), array([0], dtype=int64))
表示x的第一行匹配z的第一行
如果您只想知道x 的行是否在z 的行中:
print(np.where(np.isin(vview(x), vview(z)).squeeze()))
(array([0], dtype=int64),)
与@mujjiga 在大数组上的检查时间相比:
x = np.random.randint(10, size = (1000, 4))
z = np.random.randint(10, size = (1000, 4))
%timeit np.where(np.isin(vview(x), vview(z)).squeeze())
365 µs ± 13.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit [i for i, e in enumerate(x) if (e == z).all(1).any()] # @mujjiga
21.3 ms ± 1.28 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit np.where((x[:, None] == z).all(-1).any(-1)) # @orgoro
20 ms ± 767 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
因此,循环和切片的速度大约提高了 60 倍,这可能是由于快速短路并且只比较了 1/4 的值