两个类似的阵列数组包含测试。一个通过,另一个引发ValueError。为什么?

时间:2017-10-11 21:28:33

标签: python arrays numpy containment

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]根据调试器(内容除外)似乎具有完全相似的特征。那么这两种情况有何不同?为什么第二个失败而第一个失败呢?

2 个答案:

答案 0 :(得分:2)

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

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

使theArray数组不会有帮助,因为数组的in会生成basically no sense

由于优化列表的执行,

pair[0] in theArray碰巧没有引发异常。列表在is ==之前尝试进行in比较,而pair[0]碰巧与theArray的第一个元素完全相同,因此列表从不开始尝试==并对其返回值感到困惑。

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

如果你想检查NumPy数组是否等于&#34;在具有相同形状和相同元素的意义上的数组列表中的数组中,使用any(numpy.array_equal(obj, element) for element in l)

答案 1 :(得分:0)

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

正如@ user2357112所说,问题是列表的元素是numpy数组,所以'in'取决于的==比较不起作用

但您可以使用以下结构:

service.users().labels().list(userId=user_id)\
   .execute(http=self.__get_credentials().authorize(httplib2.Http()))