Python中两个矩阵列表的比较:查找不在第二个列表中的元素
解决矩阵列表比较时的真值歧义报错
问题根源
这个报错是因为你列表里的元素是numpy数组,直接用i not in B时,Python会尝试对比i和B中的每个数组。但numpy数组间的==运算会返回逐元素的布尔数组,而非单个布尔值,Python无法将这个数组直接判定为True或False,所以抛出"The truth value of an array with more than one element is ambiguous"错误。
两种可行解法
解法1:转成元组做集合查找
numpy数组不可哈希,但转成元组后可以正常做相等判断和集合查找,效率还高:
import numpy as np # 示例A、B列表 A = [np.array([1,2]), np.array([3,4]), np.array([5,6])] B = [np.array([3,4]), np.array([7,8])] new_list1 = [] # 先把B里的数组全转成元组,存成集合 B_tuple_set = {tuple(arr) for arr in B} for arr in A: if tuple(arr) not in B_tuple_set: new_list1.append(arr) print("列表1中不在列表2里的元素:", new_list1)
解法2:用numpy的array_equal逐个对比
用np.array_equal来判断两个数组是否完全相等,它会返回单个布尔值,刚好满足条件判断的需求:
import numpy as np A = [np.array([1,2]), np.array([3,4]), np.array([5,6])] B = [np.array([3,4]), np.array([7,8])] new_list1 = [] for arr in A: # 检查B中有没有和arr完全相等的数组,没有就加入结果 if not any(np.array_equal(arr, b) for b in B): new_list1.append(arr) print("列表1中不在列表2里的元素:", new_list1)
补充说明
- 解法1适合B元素较多的场景,集合查找是O(1)时间复杂度,比逐个遍历快;
- 解法2不需要转换数据类型,逻辑更直观,适合元素数量少的情况。
内容的提问来源于stack exchange,提问作者user1972
相关产品推荐
相关产品推荐

