Numpy:需要了解"in"运算符会发生什么

mac*_*mac 6 python numpy python-2.7

如果有人可以帮助我(并解释发生了什么),我将不胜感激.

这有效:

>>> from numpy import array
>>> a = array((2, 1))
>>> b = array((3, 3))
>>> l = [a, b]
>>> a in l
True
Run Code Online (Sandbox Code Playgroud)

但这不是:

>>> c = array((2, 1))
>>> c in l
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Run Code Online (Sandbox Code Playgroud)

我想要复制的行为是:

>>> x = (2, 1)
>>> y = (3, 3)
>>> l2 = [x, y]
>>> z = (2, 1)
>>> z in l2
True
Run Code Online (Sandbox Code Playgroud)

请注意,上面的内容也适用于可变对象:

>>> x = [2, 1]
>>> y = [3, 3]
>>> l2 = [x, y]
>>> z = [2, 1]
>>> z in l2
True
Run Code Online (Sandbox Code Playgroud)

当然,知道:

>>> (a < b).all()
True
Run Code Online (Sandbox Code Playgroud)

我试过(并且失败了):

>>> (c in l).all()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 6

Python做出的选择bool([False,True])True因为(它说)任何非empy列表都有布尔值True.

Numpy做出了bool(np.array([False, True]))应该引发ValueError 的选择.Numpy的设计是从一些用户可能想知道数组中的任何元素是否为True,而其他用户可能想知道数组中的所有元素是否为True.由于用户可能有相互冲突的欲望,NumPy拒绝猜测.它引发了一个ValueError并建议使用np.anynp.all(尽管如果有人希望复制类似Python的行为,你会使用它len).

在评估时c in l,Python会cl开头的每个元素进行比较a.它评估bool(c==a).我们得到了bool(np.array([True True])),它引发了一个ValueError(由于上面描述的原因).

由于numpy拒绝猜测,你必须具体.我建议:

import numpy as np
a=np.array((2,1))
b=np.array((3,3))
c=np.array((2,1))
l=[a,b]
print(any(np.all(c==elt) for elt in l))
# True
Run Code Online (Sandbox Code Playgroud)

  • `list .__包含__()`首先检查身份,然后检查相等性.所以`a in [a,b]`只返回True,因为第一项是'a`.其他任何东西,即使是碰巧具有所有相同的"a"值的不同数组对象,也会评估相等性比较,得到一个数组,然后在尝试将该数组转换为bool时获得异常. (5认同)