Construire un ensemble python à partir d'une matrice numpy
Je suis en train d'accomplir le suivant
>> from numpy import *
>> x = array([[3,2,3],[4,4,4]])
>> y = set(x)
TypeError: unhashable type: 'numpy.ndarray'
Comment puis-je créer facilement et efficacement un ensemble à partir d'un tableau numpy?
source d'informationauteur dzhelil | 2009-12-21
Vous devez vous connecter pour publier un commentaire.
Si vous voulez un ensemble d'éléments, voici un autre, probablement plus rapide:
PS: après avoir effectué des comparaisons entre les
x.flat
x.flatten()
etx.ravel()
sur un 10x100 tableau, j'ai découvert qu'ils fonctionnent à la même vitesse. Pour une matrice 3x3, la version la plus rapide est l'itérateur version:dont je vous recommande car il est le moins de mémoire chère, la version (il s'adapte bien à la taille de la matrice).
PS: Il y a aussi un NumPy fonction qui fait la même chose:
Ce ne produire un tableau NumPy avec le même élément que
set(x.flat)
mais comme un tableau NumPy. C'est très rapide (près de 10 fois plus rapide), mais si vous avez besoin d'unset
puis de le faireset(numpy.unique(x))
est un peu plus lent que les autres procédures (la construction d'un ensemble est livré avec un grand frais généraux).L'immuable en contrepartie d'un tableau est le n-uplet, par conséquent, essayez de convertir le tableau de tableaux dans un tableau de n-uplets:
Les réponses ci-dessus ne fonctionne si vous souhaitez créer un ensemble de la éléments contenues dans un
ndarray
mais si vous souhaitez créer un ensemble dendarray
objets – ou de l'utilisationndarray
objets comme des clés dans un dictionnaire, alors vous aurez à fournir un hashable wrapper pour eux. Voir le code ci-dessous pour un exemple simple:À l'aide de la classe wrapper est assez simple:
Si vous voulez un ensemble d'éléments:
Pour un ensemble de lignes:
J'ai aimé xperroni l'idée de. Mais je pense que la mise en œuvre peut être simplifiée en utilisant l'héritage direct de ndarray au lieu de l'emballage.
NumPy
ndarray
peut être considéré comme de la classe dérivée et utilisé comme hashable objet.view(ndarray)
peut être utilisé pour la sauvegarde de la transformation, mais il n'est même pas nécessaire dans la plupart des cas.