6 votes

Obtenir les indices pour tous les éléments d'un tableau en numpy

J'essaie d'obtenir une liste des indices de tous les éléments d'un tableau. Ainsi, pour un tableau de 1000 x 1000, je me retrouve avec [(0,0), (0,1),...,(999,999)].

J'ai créé une fonction pour faire cela qui est ci-dessous :

def indices(alist):
    results = []
    ele = alist.size
    counterx = 0
    countery = 0
    x = alist.shape[0]
    y = alist.shape[1]
    while counterx < x:
        while countery < y:
            results.append((counterx,countery))
            countery += 1
        counterx += 1
        countery = 0
    return results

Après l'avoir chronométré, il m'a semblé assez lent car il prenait environ 650 ms pour s'exécuter (sur un ordinateur portable lent). Alors, pensant que numpy doit avoir un moyen de faire cela plus rapidement que mon codage médiocre, j'ai jeté un coup d'oeil à la documentation et j'ai essayé :

indices = [k for k in numpy.ndindex(q.shape)]
which took about 4.5 SECONDS (wtf?)
indices = [x for x,i in numpy.ndenumerate(q)]
better, but 1.5 seconds!

Y a-t-il un moyen plus rapide de le faire ?

Merci

10voto

mgilson Points 92954

Comment np.ndindex ?

np.ndindex(1000,1000)

Ceci renvoie un objet itérable :

>>> ix = numpy.ndindex(1000,1000)
>>> next(ix)
(0, 0)
>>> next(ix)
(0, 1)
>>> next(ix)
(0, 2)

En général, si vous avez un tableau, vous pouvez construire l'index itérable via :

index_iterable = np.ndindex(*arr.shape)

Bien sûr, il y a toujours np.ndenumerate également, ce qui pourrait être mis en œuvre comme suit :

def ndenumerate(arr):
    for ix in np.ndindex(*arr.shape):
        yield ix,arr[ix]

4voto

theJollySin Points 2695

Avez-vous pensé à utiliser itertools ? Il générera un itérateur pour vos résultats, et sera presque certainement rapide de manière optimale :

import itertools

a = range(1000)
b = range(1000)

product = itertools.product(a, b)

for x in product:
    print x

# (0, 0)
# (0, 1)
# ...
# (999, 999)

Remarquez que cela n'a pas nécessité la dépendance à l'égard de numpy . Remarquez également l'utilisation amusante de range pour créer une liste de 0 à 999.

3voto

Jason White Points 646

Ahha !

Utilisation de numpy pour construire un tableau de toutes les combinaisons de deux tableaux

Exécution en 41 ms au lieu de 330 ms avec itertool.product !

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