gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:22:19 26 4
gpt4 key购买 nike

使 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com