2016-09-24 19 views
5

Jestem całkiem nowy w Pythonie numpy. Próbowałem użyć numpy array jako klucza w słowniku w jednej z moich funkcji, a następnie zostałem poinformowany przez interpreter języka Python, że numpy array nie jest hashable. Właśnie dowiedziałem się, że jednym ze sposobów rozwiązania tego problemu jest użycie funkcji repr() do konwersji numpy array na ciąg znaków, ale wydaje się to bardzo kosztowne. Czy istnieje lepszy sposób osiągnięcia tego samego efektu?Python - Alternatywa dla używania tablicy numpy jako klucza w słowniku

Aktualizacja: Potrafię stworzyć nową klasę zawierającą tablicę numpy, która wydaje się być właściwą drogą do osiągnięcia tego, co chcę. Zastanawiasz się, czy istnieje jakaś lepsza metoda?

update 2: Używanie klasy do zawarcia danych w tablicy i nadpisanie funkcji __hash__ jest dopuszczalne, jednak wolałbym rozwiązanie dostarczone przez @hpaulj. Konwertuj array/list na tuple lepiej spełnia moje potrzeby, ponieważ nie wymaga dodatkowej klasy.

+0

Co robisz, że chcesz użyć tablicy numpy (w jakiejkolwiek formie) jako klucza słownika? –

+0

Możesz użyć danych w tablicy numpy, aby utworzyć 'hash', który może być użyty jako klucz do słownika. – ZdaR

+0

@JonClements Potrzebuję słownika do odwzorowania wektora 1-d na zbiór punktów – Jiayi

Odpowiedz

6

Po wykonaniu niektórych badań i przeczytaniu wszystkich komentarzy. Myślę, że znałem odpowiedź na moje własne pytanie, więc po prostu je zapisałem.

  1. Napisz klasę zawierać dane w array a następnie zastąpić __hash__ funkcję do zmiany sposobu, jak to jest hashed jak wspomniano przez ZdaR
  2. przekonwertować ten array do tuple, która sprawia, że ​​lista hashable instantaneously.Thanks do hpaulj

wolałbym metoda nr 2, ponieważ lepiej pasuje moje potrzeby, jak również prostsze. Jednak korzystanie z klasy może przynieść dodatkowe korzyści, więc może być przydatne.

0

Jeśli chcesz szybko zapisać numpy.ndarray jako klucz w słowniku, szybkim rozwiązaniem jest użycie ndarray.tobytes(), która będzie zwracać surowego pyton bytes łańcuch, który jest niezmienny

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