如何在numpy中从数组内移除另一个数组包含的子数组元素
问题原因
你写的遍历逻辑不生效是因为numpy数组的in运算逻辑和普通Python列表不一样。普通Python列表的in会逐元素对比子列表内容,但是numpy中直接用arr in a判断的是数组对象的内存地址是否存在,而不是对比子数组的元素值是否匹配,所以判断结果不符合预期,过滤逻辑自然不生效。
实现方案
方案1:转换为元组对比(简单易读,适合小规模数组)
把每个子数组转成可哈希的元组,再做存在性判断,用集合存储a的子数组可以进一步提升查询效率:
import numpy as np a = np.array([[1, 1], [1, 2]]) b = np.array([[1, 1], [1, 2], [1, 3]]) a_set = set(tuple(row) for row in a) c = np.array([row for row in b if tuple(row) not in a_set])
输出的c就是[[1 3]],符合预期。
方案2:纯numpy向量化操作(适合大规模数组,效率更高)
利用numpy的广播机制做逐元素对比,再判断整行是否完全匹配,不需要写显式循环,数组规模大的时候性能远好于列表推导:
# 广播对比b的每一行和a的每一行,得到布尔匹配结果 match = (b[:, None] == a).all(-1).any(-1) # 筛选出b中不匹配a的行作为结果 c = b[~match]
内容的提问来源于stack exchange,提问作者Po Chen Liu
相关产品推荐
相关产品推荐

