python-3.x - 如何使包含 numpy 数组的元组可散列?

标签 python-3.x numpy tuples hashable

使 numpy 数组可散列的一种方法是将其设置为只读。这在过去对我有用。但是当我在元组中使用这样一个 numpy 数组时,整个元组不再是可散列的,我不明白。这是我放在一起来说明问题的示例代码:

import numpy as np

npArray = np.ones((1,1))
npArray.flags.writeable = False
print(npArray.flags.writeable)

keySet = (0, npArray)
print(keySet[1].flags.writeable)

myDict = {keySet : 1}

首先,我创建了一个简单的 numpy 数组并将其设置为只读。然后我将它添加到一个元组并检查它是否仍然是只读的(它是)。

当我想在字典中使用元组作为键时,我收到错误 TypeError: unhashable type: 'numpy.ndarray' .

这是我的示例代码的输出:
False
False
Traceback (most recent call last):
  File "test.py", line 10, in <module>
    myDict = {keySet : 1}
TypeError: unhashable type: 'numpy.ndarray'

我该怎么做才能使我的元组可散列化,为什么 Python 首先会显示这种行为?

最佳答案

你声称

One way to make a numpy array hashable is setting it to read-only



但事实并非如此。将数组设置为只读只会使其只读。由于多种原因,它不会使数组可散列。

第一个原因是带有 writeable 的数组标志设置为 False仍然是可变的。首先,您可以随时设置 writeable=True再次并继续写入它,或者做一些更奇特的事情,比如重新分配它的 shape即使 writeableFalse .其次,即使不接触数组本身,您也可以通过另一个具有 writeable=True 的 View 来改变其数据。 .
>>> x = numpy.arange(5)
>>> y = x[:]
>>> x.flags.writeable = False
>>> x
array([0, 1, 2, 3, 4])
>>> y[0] = 5
>>> x
array([5, 1, 2, 3, 4])

其次,要使散列性有意义,对象首先必须是可相等的 - ==必须返回一个 bool 值,并且必须是一个等价关系。 NumPy 数组不会这样做。散列值的目的是快速定位相等的对象,但是当您的对象甚至没有内置的相等概念时,提供散列就没有多大意义了。

你不会得到里面有数组的可散列元组。你甚至不会得到可散列的数组。您能得到的最接近的方法是将数组数据的其他一些表示形式放入元组中。

关于python-3.x - 如何使包含 numpy 数组的元组可散列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46961952/

相关文章:

python - 如何将项目从一个 QTreeWidget 移动到另一个 QTreeWidget 并跟踪信息?

python - 拆分没有空字符串的python字符串

python - 交换嵌套字典的键

python - 我可以强制 python 数组元素具有特定大小吗?

python-3.x - 在 tkinter python 中给单选按钮一个默认值

python - 复数的表示法不一致

python - numpy.searchsorted 用于包含 numpy.nan 的数组

Python 从满足给定条件的列表中删除元组

c# - 在 List<Tuple> 中的 Item2 中搜索

list - Haskell 递增元组的最后一个元素