检查一个数组是否是一组数组中的元素。

6

我有13个Python NumPy数组:

obj_1=np.array([784,785,786,787,788,789,790,791,792])
obj_2=np.array([716,717,718,730,731,732,721,722,724,726,727])
obj_3=np.array([658,659,660,661,662,663,664,665])
obj_4=np.array([581,582,583,589,590,591,595,597,598,599,601,605,606,613,614])
obj_5=np.array([533,534,535,536,537])
obj_6=np.array([464,469,472,474])
obj_7=np.array([406,409,411,412])
obj_8=np.array([345,346,347,349])
obj_9=np.array([277,278,281,282,283,284,288,296])
obj_10=np.array([217,219,220,223,224])
obj_11=np.array([154,155,156,157,158,159,160,161])
obj_12=np.array([91,92,93,94,95,96,97])
obj_13=np.array([28,29,30,31,32,33,34])

接下来是以下循环:

for i in [obj_1, obj_2, obj_3, obj_4, obj_5, obj_6, obj_7, obj_8, obj_9, obj_10, obj_11, obj_12, obj_13]:
    print i in [obj_1, obj_2, obj_3, obj_4, obj_5, obj_6, obj_7, obj_8, obj_9]

我期望得到以下输出:
True
True
True
True
True
True
True
True
True
False
False
False
False

但是我收到了以下错误:

True
True
True
True
True
True
Traceback (most recent call last):

File "<ipython-input-221-c03c1ef308c6>", line 16, in <module>
print i in [obj_1, obj_2, obj_3, obj_4, obj_5, obj_6, obj_7, obj_8, obj_9]

ValueError: The truth value of an array with more than one element is ambiguous. Use  a.any() or a.all()

我用相同的数组名称和相同的for循环测试了不同的数组,它们都没有出现错误。

看起来问题可能在于数组的内容,但我无法找到问题所在。

有人知道为什么会发生这种情况吗?


你是指子集吗?你知道obj_1obj_9将始终在数组列表中吗?只有10、11、12、13不在其中。 - Padraic Cunningham
你可能需要使用.tolist(),但我真的不明白你想做什么。 - Padraic Cunningham
我看不出这个错误是怎么从这段代码中产生的 - 你似乎没有检查任何数组的真值。 - rlms
我编辑了我的问题,希望现在我的问题更清晰了?感谢您的快速回复!! - orieger
这很有趣。obj_3 in [obj_6]False,但 obj_7 in [obj_6] 抛出了错误... - Claudiu
有趣但有点令人沮丧。obj_8 in [obj_6] 也会抛出错误,其余的则会返回 FalseTrueobj_7obj_8 是否存在某种损坏? - orieger
1个回答

4
当你执行 obj in list 时,Python会将 obj 与列表中的每个成员进行相等性比较。问题在于,NumPy中的等号运算符不是一致的。例如:
>>> obj_3 == obj_6
False

由于它们长度不同,将返回一个布尔值。
>>> obj_7==obj_6
array([False, False, False, False], dtype=bool)

因为它们具有相同的长度,所以数组逐个元素进行比较,并返回一个numpy数组。在这种情况下,真值是不确定的。看起来这种奇怪的行为将会在未来发生改变

正确的方法是逐个比较每对数组,例如使用numpy.array_equal

for i in [obj_1, obj_2, obj_3, obj_4, obj_5, obj_6, obj_7, obj_8, obj_9, obj_10, obj_11, obj_12, obj_13]:
    print any(np.array_equal(i, j) for j in [obj_1, obj_2, obj_3, obj_4, obj_5, obj_6, obj_7, obj_8, obj_9])

得到你:

True
True
True
True
True
True
True
True
True
False
False
False
False

2
啊,是的,那一定是这样。进一步解释一下:在 [b, c, d] 中的 a 实际上检查了 bool(a==b)bool(a==c)bool(a==d),如果 ac 长度相同,则返回一个数组,其真值无法确定。 - Claudiu
1
我认为这是正确的,但严谨起见,在测试相等性之前似乎使用id(或类似的东西)来比较数组。例如,即使bool(obj_1 == obj_1)引发错误,obj_1 in [obj_1]也会返回True。相等性测试不是首先发生的。 - Alex Riley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接