web-dev-qa-db-fra.com

Comment itérer un tableau NumPy 1d avec index et valeur

Pour python dict, je pourrais utiliser iteritems() pour parcourir la clé et la valeur en même temps. Mais je ne trouve pas une telle fonctionnalité pour le tableau NumPy. I devez suivre manuellement idx comme ceci:

idx = 0 
for j in theta:
   some_function(idx,j,theta)
   idx += 1

Y a-t-il une meilleure manière de faire cela?

10
user40780

Il existe quelques alternatives. Ce qui suit suppose que vous itérez sur un tableau NumPy 1d.

Itérer avec range

for j in range(theta.shape[0]):  # or range(len(theta))
   some_function(j, theta[j], theta)

Notez qu'il s'agit de la seule des 3 solutions qui fonctionneront avec numba . Ceci est remarquable car l'itération sur un tableau NumPy n'est généralement efficace que lorsqu'elle est combinée avec numba ou un autre moyen de précompilation.

Itérer avec enumerate

for idx, j in enumerate(theta):
   some_function(idx, j, theta)

La plus efficace des 3 solutions pour les baies 1d. Voir l'analyse comparative ci-dessous.

Itérer avec np.ndenumerate

for idx, j in np.ndenumerate(theta):
   some_function(idx[0], j, theta)

Notez l'étape d'indexation supplémentaire dans idx[0]. Cela est nécessaire car l'index (comme shape) d'un tableau NumPy 1d est donné sous la forme d'un tuple singleton. Pour un tableau 1d, np.ndenumerate est inefficace; ses avantages ne se manifestent que pour les tableaux multidimensionnels.

Analyse comparative des performances

# Python 3.7, NumPy 1.14.3

np.random.seed(0)

arr = np.random.random(10**6)

def enumerater(arr):
    for index, value in enumerate(arr):
        index, value
        pass

def ranger(arr):
    for index in range(len(arr)):
        index, arr[index]
        pass

def ndenumerater(arr):
    for index, value in np.ndenumerate(arr):
        index[0], value
        pass

%timeit enumerater(arr)    # 131 ms
%timeit ranger(arr)        # 171 ms
%timeit ndenumerater(arr)  # 579 ms
23
jpp

Vous pouvez utiliser numpy.ndenumerate par exemple

import numpy as np
test_array = np.arange(2, 3, 0.1)
for index, value in np.ndenumerate(test_array):
    print(index[0], value)

Pour plus d'informations, reportez-vous à https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndenumerate.html

5
sushmit