使 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 首先会表现出这种行为?
你声称
使 numpy 数组可哈希的一种方法是将其设置为只读
但事实并非如此。将数组设置为只读只会使其变为只读。由于多种原因,它不会使数组变得可散列。
第一个原因是数组writeable
标志设置为False
仍然是可变的。首先,您可以随时设置writeable=True
再次并继续写入它,或者做更奇特的事情,例如重新分配它shape
即使在writeable
is False
。其次,即使不接触数组本身,您也可以通过另一个具有以下功能的视图来改变其数据:writeable=True
.
>>> 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])
其次,要使可散列性有意义,对象必须首先是可等同的 - ==
必须返回布尔值,并且必须是等价关系。 NumPy 数组不会这样做。哈希值的目的是快速定位相等的对象,但是当您的对象甚至没有内置的相等概念时,提供哈希值就没有多大意义。
您不会获得内部包含数组的可散列元组。你甚至不会得到可散列数组。最接近的方法是将数组数据的其他表示形式放入元组中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)