Reputation: 615
I'm pretty new to Python numpy. I attempted to use the numpy array as the key in the dictionary in one of my functions and then was told by the Python interpreter that the numpy array is not hashable. I've just found out that one way to work this issue around is to use repr()
function to convert a numpy array to a string but it seems very expensive. Is there any better way to achieve the same effect?
Update: I could create a new class to contain the numpy array, which seems to be the right way to achieve what I want. Just wondering if there is any better method.
update 2: Using a class to contain data in the array and then override __hash__
function is acceptable, however, I'd prefer the solution provided by @hpaulj. Converting the array/list
to a tuple
fits my need in a better way as it does not require an additional class.
Upvotes: 36
Views: 26543
Reputation: 37
I just ran into that issue and there's a very simple solution to it using list comprehension:
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)
The result should be:
[1 2]
I don't know how efficient this is but seems like a very practical and straight-forward solution, no conversions or new classes needed :)
Upvotes: -3
Reputation: 906
If you want to quickly store a numpy.ndarray
as a key in a dictionary, a fast option is to use ndarray.tobytes() which will return a raw python bytes
string which is immutable
my_array = numpy.arange(4).reshape((2,2))
my_dict = {}
my_dict[my_array.tobytes()] = None
Upvotes: 37
Reputation: 615
After done some researches and reading through all comments. I think I've known the answer to my own question so I'd just write them down.
array
and then override __hash__
function to amend the way how it is hashed as mentioned by ZdaRarray
to a tuple
, which makes the list hashable instantaneously.Thanks to hpauljI'd prefer method No.2 because it fits my need better, as well as simpler. However, using a class might bring some additional benefits so it could also be useful.
Upvotes: 13