我有以下代码:
def getEmptySquares(self):
emptySquares=deque([])
for i in range(self.grid.shape[0]):
for j in range(self.grid.shape[1]):
if np.array([i,j]) not in dequeList:
emptySquares.append(np.array([i,j]))
print(emptySquares)
其中网格是一个numpy数组。
dequeList变量的示例是:
deque([array([5, 7]), array([6, 7]), array([6, 6]), array([6, 5]), array([6, 4]), array([5, 4])])
运行此函数时出现以下错误:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
为什么会这样?
您在这里遇到的问题是,numpy并未将__eq__
的np.array
定义为比较对象,而是一种构造“逻辑”数组的方法。
考虑数组:
some_array = np.array([1, 2, 3, 4])
您期望some_array == some_array
的值是多少?通常在Python中,我们希望它是True
,但在numpy中不是这种情况:
>>> some_array == some_array
array([True, True, True, True])
[而不是布尔值,将==
与np.array
结合使用会产生另一个np.array
。如果我们尝试将此数组视为布尔值,则会收到您遇到的错误:
>>> bool(some_array)
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()
这里会弹出此错误,因为检查collections.deque
中是否包含对象涉及对deque
进行迭代并将每个元素与所讨论的对象进行比较。在每一步中,python都调用np.array.__eq__
方法,然后在接收到数组而不是bool
时“感到困惑”。
[为了减轻这种情况,您需要手动在deque
中搜索有问题的数组,而不是依赖in
运算符。这可以通过将内置的any
应用于执行逐元素比较的生成器来完成:
any