J'ai une matrice numpie structurée avec deux colonnes où les éléments de chaque colonne sont tous uniques. Par exemple: Je voudrais rechercher une valeur basée sur l'index. Idéalement, un moyen de renvoyer 'B' où l'index est «2», par exemple. C'est la meilleure méthode que j'ai trouvée jusqu'à présent: p> Pour que cela soit moins riche à mettre en œuvre, j'ai enveloppé la logique dans une fonction: p> Est-ce que quelqu'un sait-il d'une façon de le faire sans tant de code hacky? Ce serait bien sûr, bien sûr, s'il y avait une fonction np.where code> qui fonctionnait comme ceci, comme np.where (arr ['idx'] == 2, arrêt ['valeur ']) code> où une seule valeur a été renvoyée et aucune valeur "autre" n'était requise. Merci. P> p>
4 Réponses :
Si je vous comprends correctement, cela devrait faire l'affaire: ou dans votre fonction p> mais honnêtement comme votre La matrice est construite, j'utilise simplement un dictionnaire. Vous pouvez en lire plus sur des dictionnaires ici: P> HTTPS: / /docs.python.org/2/tatulytial/datratégutructures.html#dicarications p> et vous pouvez extraire la valeur simplement par: p> my_dict.values()
Je ne sais pas si NUMPY est nécessaire, mais si ce n'est pas un dictionnaire est idéal: dans ce dictionnaire, vous pouvez par exemple utiliser numpy.int8 code> Types de clés, si les types sont la raison de l'utilisation de numpy. p> p>
Vous avez raison, un dictionnaire serait idéal. Mais dans ce cas, tout est entré et sort comme des tableaux numpus et je préfère ne pas convertir à un nouveau type de données simplement pour rechercher une valeur.
Si vous allez faire cela plusieurs fois, il est préférable que vous triez le tableau (une fois), puis utilisez np.searchsorte code> sur chaque requête:
import numpy as np
arr = np.array(
[(1,'a'),(2, 'b'),(3, 'c')],
dtype=[('idx', np.int8), ('value', np.unicode_, 16)]
)
arr_sorted = np.sort(arr)
value = arr_sorted['value'][np.searchsorted(arr_sorted['idx'], 2)]
In [309]: arr[np.where(arr['idx']==4)]['value'] Out[309]: array([], dtype='<U16') In [310]: arr[np.where(arr['idx']>1)]['value'] Out[310]: array(['b', 'c'], dtype='<U16')
Je pense que tu as cloué, merci. Renvoyer une ligne de données Compte tenu de l'indice est ce que je recherche et beaucoup plus concis que ce que j'ai écrit à l'origine. Je n'utilise pas très souvent des nombres très souvent et je pense que ma question est la preuve :).
Pourquoi n'utilisez-vous pas Pandas à la place?