Python 将numpy数组添加到堆队列

Python 将numpy数组添加到堆队列,python,arrays,numpy,heap,Python,Arrays,Numpy,Heap,有人能解释一下为什么下面的代码会导致ValueError吗 import heapq import numpy as np a = np.ones((2, 2), dtype=int) states = [] heapq.heappush(states, (0, a)) heapq.heappush(states, (0, a.copy())) 错误消息是: Traceback (most recent call last): File "x.py", line 8, in <m

有人能解释一下为什么下面的代码会导致ValueError吗

import heapq
import numpy as np

a = np.ones((2, 2), dtype=int)

states = []
heapq.heappush(states, (0, a))
heapq.heappush(states, (0, a.copy()))
错误消息是:

Traceback (most recent call last):
  File "x.py", line 8, in <module>
    heapq.heappush(states, (0, a.copy()))
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
回溯(最近一次呼叫最后一次):
文件“x.py”,第8行,在
heapq.heappush(状态,(0,a.copy())
ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()

在不向堆中添加
a.copy()
的情况下运行它可以很好地工作,第二个/后续的一个出于某种原因是一个问题。我确实理解,数组
[True,False,True]
中存在未知的真值方面,并且不可能从中确定单个
,但是为什么
heapq
需要这样做呢?尤其是仅在第二种情况下?

TL;DR:因为如果numpy数组包含多个元素,则无法将其转换为布尔值


有关堆的一些信息:


堆对其内容进行“排序”(因此项必须实现
TL;DR):因为如果numpy数组包含多个元素,则无法将其转换为布尔值


有关堆的一些信息:


堆“排序”其内容(因此项必须实现
heapq需要比较堆元素。堆元素是元组,元组的第一个条目相等,因此它比较第二个元素。比较第二个元素不会产生可以解释为布尔值的内容。请注意
heapq.heappush(heap,(x,y))
并不意味着“使用优先级推送东西
y
”,而是意味着“推送东西
(x,y)
”。我们没有单独的优先级和元素;我们只有元素。heapq需要比较堆元素。堆元素是元组,元组的第一个条目相等,因此它比较第二个元素。比较第二个元素不会产生可以解释为布尔值的内容。请注意
heapq.heappush(heap,(x,y))
并不意味着“推送东西
y
优先级
x
”;它意味着“推送东西
(x,y)
”。我们没有单独的优先级和元素;我们只有元素。堆是稳定的,对它们的内容进行“排序”…这意味着比较相等的项目的顺序将与它们最初的顺序相同。”-你在说什么?heapq根本不能保证这一点,它也不能做你描述的值-位置元组的事情。如果你想要这种行为,你必须自己做。@user2357112谢谢你的评论,我更正了答案。“堆是稳定的,而且”顺序“它们的内容……意味着比较相等的项目将与最初的顺序相同“-你在说什么?heapq根本不能保证这一点,它也不能做你描述的值-位置元组的事情。如果你想要这种行为,你必须自己做。@user2357112谢谢你的评论,我更正了答案。”。
>>> arr = np.array([1,2,3])
>>> bool(arr)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> if arr: pass
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> arr > arr
array([False, False], dtype=bool)
>>> arr == arr
array([ True,  True], dtype=bool)
>>> if arr == arr: pass
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> arr is arr
True
>>> arr is arr.copy()
False