101 votes

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

En Python, nous pouvons obtenir l'indice d'une valeur dans un tableau en utilisant .index() .

Mais avec un tableau NumPy, lorsque j'essaie de faire :

decoding.index(i)

J'ai compris :

AttributeError : L'objet 'numpy.ndarray' ne possède pas d'attribut 'index'.

Comment pourrais-je faire cela sur un tableau NumPy ?

157voto

Saullo Castro Points 12260

Utilice np.where pour obtenir les indices où une condition donnée est True .

Exemples :

Pour une 2D np.ndarray appelé a :

i, j = np.where(a == value) # when comparing arrays of integers

i, j = np.where(np.isclose(a, value)) # when comparing floating-point arrays

Pour un tableau 1D :

i, = np.where(a == value) # integers

i, = np.where(np.isclose(a, value)) # floating-point

Notez que cela fonctionne également pour des conditions telles que >= , <= , != et ainsi de suite...

Vous pouvez également créer une sous-classe de np.ndarray avec un index() método:

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)

Test :

a = myarray([1,2,3,4,4,4,5,6,4,4,4])
a.index(4)
#(array([ 3,  4,  5,  8,  9, 10]),)

31voto

Statham Points 1642

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

c'est exactement ce que vous vouliez.

16voto

jlansey Points 1540

Je suis partagé entre ces deux façons d'implémenter un index d'un tableau NumPy :

idx = list(classes).index(var)
idx = np.where(classes == var)

Les deux méthodes prennent le même nombre de caractères, mais la première renvoie un fichier int au lieu d'un numpy.ndarray .

9voto

Eelco Hoogendoorn Points 2218

Ce problème peut être résolu efficacement en utilisant le numpy_indexé (disclaimer : je suis son auteur) ; qui a été créée pour résoudre des problèmes de ce type. npi.indices peut être considérée comme une généralisation n-dimensionnelle de list.index. Elle agira sur nd-arrays (le long d'un axe spécifié) ; et recherchera également des entrées multiples d'une manière vectorisée plutôt qu'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 toutes les réponses précédemment publiées, et est entièrement vectorisée.

4voto

N.Moudgil Points 83

Vous pouvez utiliser la fonction numpy.nonzero() ou le 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 représente le indice de rang et le second tableau représente les indice de colonne .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X