Python - 在字典中使用numpy数组作为键的替代方法

Jia*_*ayi 9 python arrays dictionary numpy

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

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

更新2:使用类来包含数组中的数据然后覆盖__hash__函数是可以接受的,但是,我更喜欢@hpaulj提供的解决方案.以更好的方式将其转换array/listtuple适合我的需要,因为它不需要额外的类.

Jia*_*ayi 8

经过一些研究和阅读所有评论.我想我已经知道了我自己的问题的答案,所以我只是把它们写下来.

  1. 编写一个类来包含数据array然后覆盖__hash__函数,以修改ZdaR提到的散列方式
  2. 这个转换arraytuple,这使得该列表可哈希 instantaneously.Thanks到hpaulj

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

  • 我认为如果为将来的读者添加代码段会更好 (2认同)

Pet*_*son 8

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

my_array = numpy.arange(4).reshape((2,2))
my_dict = {}
my_dict[my_array.tobytes()] = None
Run Code Online (Sandbox Code Playgroud)

  • +2 表示密钥创建过程和密钥大小的效率。 (3认同)
  • 当数组具有不同形状时,您必须小心使用“hash(array.data.tobytes())”。例如,“np.zeros((2, 1))”和“np.zeros((1, 2))”具有相同的字节。 (2认同)