NumPy:具有多个元素的数组的真值是模棱两可的。

3
我真的很困惑为什么会出现这个错误。以下是我的代码:
import numpy as np

x = np.array([0, 0])
y = np.array([10, 10])
a = np.array([1, 6])
b = np.array([3, 7])
points = [x, y, a, b]
max_pair = [x, y]
other_pairs = [p for p in points if p not in max_pair]
>>>ValueError: The truth value of an array with more than one element is ambiguous. 
Use a.any() or a.all()
(a not in max_paix)
>>>ValueError: The truth ...

让我困惑的是,以下内容可以正常工作:

points = [[1, 2], [3, 4], [5, 7]]
max_pair = [[1, 2], [5, 6]]
other_pairs = [p for p in points if p not in max_pair]
>>>[[3, 4], [5, 7]]
([5, 6] not in max_pair)
>>>False

当使用numpy数组时,为什么会发生这种情况?使用 not in/in 是否含糊不清?
使用any()\all()的正确语法是什么?

2个回答

9

Numpy数组定义了自定义等号运算符,即它们是实现__eq__魔法函数的对象。因此,==运算符和所有依赖于该等式的其他函数/运算符都会调用这个自定义等式函数。

Numpy的相等性基于数组的逐元素比较。因此,您会得到另一个包含布尔值的numpy数组。例如:

x = np.array([1,2,3])
y = np.array([1,4,5])
x == y

返回值

array([ True, False, False], dtype=bool)

然而,in运算符与列表结合使用需要进行相等比较,只返回一个布尔值。这就是为什么错误要求使用allany的原因。例如:
any(x==y)

返回True是因为结果数组中至少有一个值为True。相比之下,

all(x==y) 

返回 False 是因为结果数组中并非所有值都为 True

所以在您的情况下,解决问题的方法如下:

other_pairs = [p for p in points if all(any(p!=q) for q in max_pair)]

打印 other_pairs 则会打印出预期的结果。

[array([1, 6]), array([3, 7])]

为什么这样做呢?我们从points中寻找一个项p,其中任意一个条目max_pair所有项q的条目不相等。


"in" 运算符需要进行相等比较。非常有帮助!我想要得到的结果(not in)可以通过 [p for p in points if all(any(p!=q) for q in max_pair)] 来获得。 - igavriil
啊,是的,抱歉我改正了那个错误 :-),漏掉了“not in”。 - SmCaterpillar

1
原因是它们完全是两个不同的对象。np.array有自己的操作符可以使用。
它们与全局操作符any和all同名,但并不完全相同,这种区别体现在它们是np.array的方法中。
>>> x = np.array([0,9])
>>> x.any(axis=0)
True
>>> y = np.array([10, 10])
>>> y.all()
True
>>> y.all(axis=0)
True

与此同时:
>>> bool([])
False
>>> bool([[]])
True
>>> bool([[]][0])
False

注意第一个结果是假的(在python2中),一个空列表被认为是False。然而,即使其中一个是空的,带有另一个列表的列表不是False,而是True。评估内部列表再次返回False,因为它是空的。由于anyall定义在转换为bool上,所以你看到的结果是不同的。
>>> help(all)
all(...)
    all(iterable) -> bool
    Return True if bool(x) is True for all values x in the iterable.

>>> help(any)
any(...)
    any(iterable) -> bool
    Return True if bool(x) is True for any x in the iterable.

在这里查看更好的逻辑numpy运算符解释 here


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