Numpy如何从二维数组中移除存在于另一二维数组的子数组并返回新数组
问题原因
你之前使用np.isin得到一维数组,是因为该函数默认逐元素判断匹配关系,只会筛选出A中单个值不在B里的元素,结果自然会被展平为一维,无法保留原有的行结构。
解决方案
方法1:广播逐行匹配(适合小规模数组)
通过维度扩展实现整行对比,逻辑直观易理解:
import numpy as np # 示例数组 A = np.array([[1, 1, 1], [2, 2, 2], [3, 3, 3], [4, 4, 4], [5, 5, 5], [6, 6, 6], [7, 7, 7], [8, 8, 8], [9, 9, 9]]) B = np.array([[1, 1, 1], [3, 3, 3], [8, 8, 8]]) # 生成行匹配掩码 mask = ~(A[:, None] == B).all(axis=-1).any(axis=-1) C = A[mask]
运行后得到的C就是你需要的二维数组结果。
逻辑说明:将A扩展为(9,1,3)的维度和B做逐元素对比,先判断每行的所有元素是否完全匹配,再判断A的每行是否匹配B的任意一行,取反后得到需要保留的行掩码。
方法2:结构化数组视图匹配(适合大规模数组)
如果数组规模较大,广播会占用过多内存,可以用结构化视图把整行转为单个元素后再用np.isin判断,性能更高:
# 将每行转为单个结构化元素 A_row_view = A.view(np.dtype((np.void, A.dtype.itemsize * A.shape[1]))) B_row_view = B.view(np.dtype((np.void, B.dtype.itemsize * B.shape[1]))) mask = ~np.isin(A_row_view, B_row_view).flatten() C = A[mask]
内容的提问来源于stack exchange,提问作者yihao ren
相关产品推荐
相关产品推荐

