Powyższe odpowiedzi działać, jeśli chcesz utworzyć zestaw Spośród elementów zawartej w ndarray
, ale jeśli chcesz utworzyć zestaw ndarray
obiektów - lub użyj ndarray
przedmiotów jak klucze w słowniku - wtedy Będą musieli podać dla nich owinięte folie. Zobacz poniższy kod na prostym przykładzie:
from hashlib import sha1
from numpy import all, array, uint8
class hashable(object):
r'''Hashable wrapper for ndarray objects.
Instances of ndarray are not hashable, meaning they cannot be added to
sets, nor used as keys in dictionaries. This is by design - ndarray
objects are mutable, and therefore cannot reliably implement the
__hash__() method.
The hashable class allows a way around this limitation. It implements
the required methods for hashable objects in terms of an encapsulated
ndarray object. This can be either a copied instance (which is safer)
or the original object (which requires the user to be careful enough
not to modify it).
'''
def __init__(self, wrapped, tight=False):
r'''Creates a new hashable object encapsulating an ndarray.
wrapped
The wrapped ndarray.
tight
Optional. If True, a copy of the input ndaray is created.
Defaults to False.
'''
self.__tight = tight
self.__wrapped = array(wrapped) if tight else wrapped
self.__hash = int(sha1(wrapped.view(uint8)).hexdigest(), 16)
def __eq__(self, other):
return all(self.__wrapped == other.__wrapped)
def __hash__(self):
return self.__hash
def unwrap(self):
r'''Returns the encapsulated ndarray.
If the wrapper is "tight", a copy of the encapsulated ndarray is
returned. Otherwise, the encapsulated ndarray itself is returned.
'''
if self.__tight:
return array(self.__wrapped)
return self.__wrapped
Korzystanie z klasy otoki jest dość proste:
>>> from numpy import arange
>>> a = arange(0, 1024)
>>> d = {}
>>> d[a] = 'foo'
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: unhashable type: 'numpy.ndarray'
>>> b = hashable(a)
>>> d[b] = 'bar'
>>> d[b]
'bar'
Dobra sugestia! Można również użyć zestawu (x.ravel()), który robi to samo, ale tworzy kopię tylko w razie potrzeby. Lub, lepiej, użyj zestawu (x.flat). x.flat to iterator nad elementami spłaszczonej tablicy, ale nie marnuje czasu na spłaszczanie tablicy – musicinmybrain
@musicinmybrain: bardzo dobre punkty! Dziękuję Ci! – EOL
OSTRZEŻENIE: ta odpowiedź * nie * da ci zestawu wektorów, lecz zbiór liczb. Jeśli chcesz zestaw wektorów, zobacz odpowiedź miku poniżej, która konwertuje wektory na krotki – conradlee