如何从numpy数组A中删除所有存在于数组B中的相同行
NumPy按行过滤数组实现方案
核心需求是从更大的数组A中,剔除所有在数组B中出现过的行,生成仅包含A独有行的数组C。
以下是两种可直接使用的实现方式:
方法1:广播逐行对比(适配中小规模数组)
实现逻辑简单直观,代码量少:
import numpy as np # 示例数组构造 A = np.array([[1,0,0], [2,0,0], [3,0,0], [4,0,0], [5,0,0]]) B = np.array([[2,0,0], [5,0,0]]) # 生成过滤掩码:A中某行不在B中则为True mask = ~(A[:, np.newaxis] == B).all(axis=2).any(axis=1) C = A[mask] # 输出验证:[[1 0 0] [3 0 0] [4 0 0]] print(C)
方法2:结构化数组映射(适配大规模数组,性能更高)
当A、B行数达到数千甚至上万时,广播对比会占用过高内存,用该方案时间、空间复杂度更低:
# 将整行转换为单个结构化void元素,可直接做包含判断 A_row = A.view(np.dtype((np.void, A.dtype.itemsize * A.shape[1]))) B_row = B.view(np.dtype((np.void, B.dtype.itemsize * B.shape[1]))) # 调用in1d快速判断行是否存在 mask = ~np.in1d(A_row, B_row) C = A[mask]
注意:使用该方法前需要确保A和B的dtype、每行元素数量完全一致,否则会出现判断错误。
内容的提问来源于stack exchange,提问作者Sbobby
相关产品推荐
相关产品推荐

