如何判断numpy数组对(含顺序反转)是否存在于目标列表
报错原因
Python原生的in运算符在对比numpy数组时,执行==比较会返回逐元素判断的布尔数组,无法直接得到单个True/False的真值结果,因此会抛出"The truth value of an array with more than one element is ambiguous"的报错。
基于
.all()的正确实现 .all()方法的作用是判断数组内所有元素均为True,你可以通过遍历数对列表,逐组对比数组元素的方式完成判断,逻辑是:只要列表中不存在和目标数对顺序一致、或顺序反转后完全相等的数对,就满足判断要求。
针对你给出的示例,可直接使用如下代码:
import numpy as np x1 = np.array([1, 2, 3]) x2 = np.array([3, 1, 2]) x3 = np.array([4, 3, 2]) x4 = np.array([5, 4, 2]) pairs_list = [[x2, x1], [x3, x4], [x2, x4]] def check_pair_not_exist(target_a, target_b, pair_storage): for stored_a, stored_b in pair_storage: # 用.all()判断两个数组完全相等,分别校验正序、反序两种匹配情况 is_match_forward = (target_a == stored_a).all() and (target_b == stored_b).all() is_match_backward = (target_b == stored_a).all() and (target_a == stored_b).all() if is_match_forward or is_match_backward: # 找到匹配项,说明数对存在,直接返回False return False # 遍历完成无匹配,说明数对(含反转)不存在 return True # 测试用例1:判断[x1,x2] print(check_pair_not_exist(x1, x2, pairs_list)) # 输出False,因为反转后的[x2,x1]在列表中 # 测试用例2:判断[x1,x3] print(check_pair_not_exist(x1, x3, pairs_list)) # 输出True,两种顺序都不在列表中
补充说明
- 如果数组存在NaN值,
(arr1 == arr2).all()会因为NaN不等于自身判断失效,这种场景可以替换为np.array_equal(arr1, arr2, equal_nan=True)做相等判断 - 不要尝试直接对列表用
in做包含判断,numpy数组的相等逻辑和Python原生对象不同,必须显式做全元素匹配校验
内容的提问来源于stack exchange,提问作者Inaki Carril
相关产品推荐
相关产品推荐

