En Python, nous pouvons obtenir l'index d'une valeur dans un tableau en utilisant .index (). Comment puis-je le faire avec un tableau NumPy?
Quand j'essaye de faire
decoding.index(i)
il est dit que la bibliothèque NumPy ne supporte pas cette fonction. Y a-t-il un moyen de le faire?
Utilisez np.where
pour obtenir les index où une condition donnée est True
.
Exemples:
Pour un np.ndarray
2D appelé a
:
i, j = np.where(a == value)
Pour un tableau 1D:
i, = np.where(a == value)
Ce qui fonctionne pour des conditions comme >=
, <=
, !=
et ainsi de suite ...
Vous pouvez également créer une sous-classe de np.ndarray
avec une méthode index()
:
class myarray(np.ndarray):
def __new__(cls, *args, **kwargs):
return np.array(*args, **kwargs).view(myarray)
def index(self, value):
return np.where(self == value)
Essai:
a = myarray([1,2,3,4,4,4,5,6,4,4,4])
a.index(4)
#(array([ 3, 4, 5, 8, 9, 10]),)
Vous pouvez convertir un tableau numpy en liste et obtenir son index.
par exemple
tmp = [1,2,3,4,5] #python list
a = numpy.array(tmp) #numpy array
i = list(a).index(2) # i will return index of 2, which is 1
je suis juste ce que tu veux.
Je suis déchiré entre ces deux manières d'implémenter un index d'un tableau NumPy:
idx = list(classes).index(var)
idx = np.where(classes == var)
Les deux prennent le même nombre de caractères, mais la première méthode renvoie int
au lieu de numpy.ndarray
.
Vous pouvez utiliser la fonction numpy.nonzero()
ou la méthode nonzero()
d'un tableau.
import numpy as np
A = np.array([[2,4],
[6,2]])
index= np.nonzero(A>1)
OR
(A>1).nonzero()
Sortie :
(array([0, 1]), array([1, 0]))
Le premier tableau de la sortie décrit le index de ligne et le second tableau représente le index de colonne .
Ce problème peut être résolu efficacement en utilisant la bibliothèque numpy_indexed (disclaimer: je suis son auteur); qui a été créé pour résoudre des problèmes de ce type. npi.indices peut être vu comme une généralisation à n dimensions de list.index. Il agira sur nd-array (le long d'un axe spécifié); et cherchera également plusieurs entrées de manière vectorielle, par opposition à un seul élément à la fois.
a = np.random.Rand(50, 60, 70)
i = np.random.randint(0, len(a), 40)
b = a[i]
import numpy_indexed as npi
assert all(i == npi.indices(a, b))
Cette solution a une meilleure complexité temporelle (n log n au pire) que n’importe laquelle des réponses précédemment publiées, et est entièrement vectorisée.
Si vous êtes intéressé par les index, le meilleur choix est np.argsort (a)
a = np.random.randint(0, 100, 10)
sorted_idx = np.argsort(a)