Cómo iterar 1D NumPy array con índice y valor

Para el iteritems() Python, podría usar iteritems() para recorrer la clave y el valor al mismo tiempo. Pero no puedo encontrar dicha funcionalidad para la matriz NumPy. Tengo que rastrear manualmente el idx esta manera:

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

¿Hay una mejor manera de hacer esto?

Hay algunas alternativas. Lo siguiente supone que estás iterando sobre una matriz NumPy 1d.

Iterar con range

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

Tenga en cuenta que esta es la única de las 3 soluciones que funcionarán con numba . Esto es digno de mención ya que la iteración sobre una matriz NumPy explícitamente solo es eficaz cuando se combina con numba u otro medio de numba .

Iterar con enumerate

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

La más eficiente de las 3 soluciones para arreglos 1d. Vea la evaluación comparativa a continuación.

np.ndenumerate con np.ndenumerate

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

Observe el paso de indexación adicional en idx[0] . Esto es necesario ya que el índice (como la shape ) de una matriz NumPy 1d se da como una tupla singleton. Para una matriz 1d, np.ndenumerate es ineficiente; Sus beneficios solo se muestran para arreglos multidimensionales.

Evaluación comparativa del rendimiento

 # 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 

Puedes usar numpy.ndenumerate por ejemplo

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

Para obtener más información, consulte https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndenumerate.html