0

Moar noob Python 问题

我有一个 NumPy 数组列表,想测试两个数组是否在里面。控制台日志:

>>> theArray
[array([[[213, 742]]], dtype=int32), array([[[127, 740]],
       [[127, 741]],
       [[128, 742]],
       [[127, 741]]], dtype=int32)]

>>> pair[0]
array([[[213, 742]]], dtype=int32)

>>> pair[1]
array([[[124, 736]]], dtype=int32)

>>> pair[0] in theArray
True

>>> pair[1] in theArray
Traceback (most recent call last):
  File "...\pydevd_exec2.py", line 3, in Exec
    exec(exp, global_vars, local_vars)
  File "<input>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

pair[0]并且pair[1]根据调试器似乎具有绝对相似的特征(内容除外)。那么这两种情况有什么不同呢?为什么第二个会失败而第一个不会?

4

2 回答 2

2

在这里使用in是一个错误。

theArray不是数组。这是一个清单。infor 列表假定这==是其元素的等价关系,但==不是 NumPy 数组的等价关系;它甚至不返回布尔值。在这里使用in基本上没有意义。

制作theArray一个数组没有帮助,因为in数组基本上没有意义

pair[0] in theArray由于执行优化列表,碰巧没有引发异常。列表在for之前尝试is比较,并且恰好是与 的第一个元素完全相同的对象,因此列表永远不会尝试并被其返回值混淆。==inpair[0]theArray==


如果要检查特定对象是否obj是列表的元素之一l(不仅仅是==- 等效于其中一个元素,实际上是该对象),请使用any(obj is element for element in l).

如果要检查 NumPy 数组是否与数组列表中的数组“相等”,即具有相同的形状和相等的元素,请使用any(numpy.array_equal(obj, element) for element in l).

于 2017-10-11T21:46:19.337 回答
0

我得到了成功和失败案例的 ValueError 。

正如@user2357112 所说,问题在于列表的元素是 numpy 数组,因此“in”所依赖的 == 比较不起作用

但您可以使用如下结构:

any(np.all(x == p[0]) for x in theArray)
于 2017-10-11T21:48:30.353 回答