检查数组是不是在数组的双端队列中? Python

Posted

技术标签:

【中文标题】检查数组是不是在数组的双端队列中? Python【英文标题】:Check if array is in deque of arrays? Python检查数组是否在数组的双端队列中? Python 【发布时间】:2020-06-14 23:11:00 【问题描述】:

我有以下代码:

   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()

为什么会这样?

【问题讨论】:

这能回答你的问题吗? ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() @AMC 虽然这两个问题之间存在一些重叠,但您链接的问题并未解决为什么在 OP 问题的上下文中会发生此错误,即在集合中搜索数组时。 【参考方案1】:

您在这里遇到的问题是 numpy 没有为 np.arrays 定义 __eq__ 作为比较,而是一种构造“逻辑”数组的方法。

考虑数组:

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.arrays 一起使用会产生另一个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 内置应用到执行元素比较的生成器来完成:

new_array = np.array([i,j])
if not any((new_array == elem).all() for elem in dequeList)):
   ...

【讨论】:

以上是关于检查数组是不是在数组的双端队列中? Python的主要内容,如果未能解决你的问题,请参考以下文章

Java 数据结构及算法实战系列 014:Java队列08——数组实现的双端队列ArrayDeque

Java 数据结构及算法实战系列 014:Java队列08——数组实现的双端队列ArrayDeque

Java 数据结构及算法实战系列 014:Java队列08——数组实现的双端队列ArrayDeque

Python实现双端队列

队列(存储结构数组)--Java实现

死磕 java集合之ArrayDeque源码分析