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?
Il existe quelques alternatives. Ce qui suit suppose que vous itérez sur un tableau NumPy 1d.
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.
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.
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.
# 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
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