web-dev-qa-db-fra.com

Index de l'élément dans le tableau NumPy

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? 

32
Marc Ortiz

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]),)
62

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.

13
Statham

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.

6
jlansey

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 .

1
N.Moudgil

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.

0
Eelco Hoogendoorn

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)
0
Victor Zuanazzi