Q = [np.array([0, 1]), np.array([1, 2]), np.array([2, 3]), np.array([3, 4])]
for q in Q:
print(q in Q)
Run Code Online (Sandbox Code Playgroud)
运行上面的代码,它在第一次迭代时给出结果“True”,而随后出现 ValueError。
真的
ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
我不知道为什么它在第二次迭代时开始出错。任何人都可以帮助我plz..
本质上,您不能用来in测试 Python 列表中的 numpy 数组。由于 Python 测试相等性的方式进行了优化,它只适用于第一个元素。
list.__contains__正在发生的事情是(遵循)的实现in是使用快捷方式通过首先检查identity来更快地找到匹配项。大多数使用 Python 的人都知道它是运算is符。这比==相等检查更快,因为所is要做的就是查看两个对象的指针是否具有相同的值,值得首先检查。身份测试对于任何 Python 对象(包括 numpy 数组)都是一样的。
如果用 Python 编写,则实现基本上如下所示:
def __contains__(self, needle):
for elem in self:
if needle is elem or needle == elem:
return True
return False
Run Code Online (Sandbox Code Playgroud)
那么你的 numpy 数组列表会发生什么:
for q in Q, 步骤1:q = Q[0]
q in Q那么就等于Q.__contains__(Q[0])
Q[0] is self[0]=> True!for q in Q, 第2步:q = Q[1]
q in Q那么就等于Q.__contains__(Q[1])
Q[1] is self[0]=> False:-(Q[1] == self[0]=> array([False, False]),因为 Numpy 数组使用广播来比较两个数组中的每个元素。结果array([False, False])不是boolean,但if想要 boolean 结果,因此它被传递给(相当于 C 语言的)bool()function。bool(array([False, False]))产生您看到的错误。
或者,手动完成:
>>> import numpy as np
>>> Q = [np.array([0, 1]), np.array([1, 2]), np.array([2, 3]), np.array([3, 4])]
>>> Q[0] is Q[0]
True
>>> Q[1] is Q[0]
False
>>> Q[1] == Q[0]
array([False, False])
>>> bool(Q[1] == Q[0])
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)
您必须使用any()并numpy.array_equal()创建一个list.__contains__不使用(正常)==相等检查的版本:
def list_contains_array(lst, arr):
return any(np.array_equal(arr, elem) for elem in lst)
Run Code Online (Sandbox Code Playgroud)
然后你可以用它来获取True你的循环:
>>> for q in Q:
... print(list_contains_array(Q, q))
...
True
True
True
True
Run Code Online (Sandbox Code Playgroud)