【发布时间】:2017-07-03 08:56:30
【问题描述】:
有人能解释一下为什么下面的代码会导致 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()
在不将a.copy() 添加到堆中的情况下运行它可以正常工作,第二个/后续一个由于某种原因是一个问题。我确实知道[True, False, True] 数组存在未知的真值方面,并且无法从中确定单个True 或False,但为什么heapq 需要这样做?尤其是第二种情况?
【问题讨论】:
-
heapq 需要比较堆元素。堆元素是元组,元组的第一个条目相等,所以它比较第二个元素。比较第二个元素不会产生可以解释为布尔值的东西。
-
请注意,
heapq.heappush(heap, (x, y))并不意味着“推送事物y优先x”;它的意思是“推东西(x, y)”。我们没有单独的优先事项和要素;我们只有元素。