You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:45:03