【问题标题】:Python - Alternative for using numpy array as key in dictionaryPython - 使用 numpy 数组作为字典中的键的替代方法
【发布时间】:2017-02-02 03:30:09
【问题描述】:

我对 Python numpy 还是很陌生。我试图在我的一个函数中使用 numpy 数组作为字典中的键,然后 Python 解释器告诉我 numpy 数组不可散列。我刚刚发现解决此问题的一种方法是使用 repr() 函数将 numpy 数组转换为字符串,但这似乎非常昂贵。有没有更好的方法来达到同样的效果?

更新:我可以创建一个新类来包含 numpy 数组,这似乎是实现我想要的正确方法。只是想知道有没有更好的方法?

更新2:使用一个类来包含数组中的数据,然后覆盖__hash__ 函数是可以接受的,但是,我更喜欢@hpaulj 提供的解决方案。将array/list 转换为tuple 以更好的方式满足我的需要,因为它不需要额外的课程。

【问题讨论】:

  • 你在做什么,你想使用一个 numpy 数组(无论它是什么形式)作为字典键?
  • 您可以使用 numpy 数组中的数据创建一个hash,它可以用作字典的键。
  • @JonClements 我需要一个字典来将一维向量映射到一组点
  • @ZdaR 会尝试的。干杯
  • 试试tuple(A.tolist())。对于一维数组,这种转换是直截了当的。

标签: python arrays numpy dictionary


【解决方案1】:

如果您想快速将numpy.ndarray 存储为字典中的键,一个快速的选项是使用ndarray.tobytes(),它将返回一个不可变的原始python bytes 字符串

my_array = numpy.arange(4).reshape((2,2))
my_dict = {}
my_dict[my_array.tobytes()] = None

【讨论】:

  • +2 提高密钥创建过程和密钥大小的效率。
  • 这很棒。既简单又高效。
  • 喜欢这个。正是我想要的。
【解决方案2】:

在做了一些研究并阅读了所有的 cmets 之后。我想我已经知道自己问题的答案,所以我就把它们写下来。

  1. 编写一个类以包含array 中的数据,然后重写__hash__ 函数以修改ZdaR 中提到的散列 方式
  2. 将此array 转换为tuple,使列表立即可散列。感谢hpaulj

我更喜欢方法 2,因为它更适合我的需要,也更简单。但是,使用类可能会带来一些额外的好处,因此它也很有用。

【讨论】:

  • 我觉得加个代码 sn-p 给以后的读者会更好
【解决方案3】:

我刚刚遇到了这个问题,使用列表理解有一个非常简单的解决方案:

import numpy as np

dict = {'key1':1, 'key2':2}
my_array = np.array(['key1', 'key2'])

result = np.array( [dict[element] for element in my_array] )
print(result)

结果应该是:

[1 2]

我不知道这有多有效,但似乎是一个非常实用且直接的解决方案,不需要转换或新类:)

【讨论】:

  • 这与问题无关。字典中的键只是字符串('key1''key2'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 2021-11-02
  • 2017-11-05
  • 2015-10-13
  • 2014-07-03
相关资源
最近更新 更多