我有 2 个 2d numpy 数组 A 和 B 我想删除 A 中出现在 B 中的所有行。
我试过这样的:
A[~np.isin(A, B)]
但是 isin 保留了 A 的维度,我需要每行一个 bool 值来过滤它。
编辑:像这样
A = np.array([[3, 0, 4],
[3, 1, 1],
[0, 5, 9]])
B = np.array([[1, 1, 1],
[3, 1, 1]])
.....
A = np.array([[3, 0, 4],
[0, 5, 9]])
最佳答案
可能不是最高效的解决方案,但可以满足您的需求。您可以将 A
和 B
的 dtype 更改为由一行组成的单元。您需要首先确保数组是连续的,例如与 ascontiguousarray
:
Av = np.ascontiguousarray(A).view(np.dtype([('', A.dtype, A.shape[1])])).ravel()
Bv = np.ascontiguousarray(B).view(Av.dtype).ravel()
现在可以申请np.isin
直接:
>>> np.isin(Av, Bv)
array([False, True, False])
根据文档,invert=True
比取反 isin
的输出更快,所以你可以这样做
A[np.isin(Av, Bv, invert=True)]
关于python - 根据第二个数组过滤numpy数组中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70789782/