Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to iterate 1d NumPy array with index and value [duplicate]

Tags:

For python dict, I could use iteritems() to loop through key and value at the same time. But I cannot find such functionality for NumPy array. I have to manually track idx like this:

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

Is there a better way to do this?

like image 261
user40780 Avatar asked Mar 20 '18 12:03

user40780


People also ask

What does [: :] mean on NumPy arrays?

The [:, :] stands for everything from the beginning to the end just like for lists. The difference is that the first : stands for first and the second : for the second dimension. a = numpy. zeros((3, 3)) In [132]: a Out[132]: array([[ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]])

How do you repeat an element in a NumPy array?

NumPy: repeat() function The repeat() function is used to repeat elements of an array. Input array. The number of repetitions for each element. repeats is broadcasted to fit the shape of the given axis.

Can I iterate through NumPy array?

Iterating Arrays Iterating means going through elements one by one. As we deal with multi-dimensional arrays in numpy, we can do this using basic for loop of python. If we iterate on a 1-D array it will go through each element one by one.


1 Answers

There are a few alternatives. The below assumes you are iterating over a 1d NumPy array.

Iterate with range

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

Note this is the only of the 3 solutions which will work with numba. This is noteworthy since iterating over a NumPy array explicitly is usually only efficient when combined with numba or another means of pre-compilation.

Iterate with enumerate

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

The most efficient of the 3 solutions for 1d arrays. See benchmarking below.

Iterate with np.ndenumerate

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

Notice the additional indexing step in idx[0]. This is necessary since the index (like shape) of a 1d NumPy array is given as a singleton tuple. For a 1d array, np.ndenumerate is inefficient; its benefits only show for multi-dimensional arrays.

Performance benchmarking

# 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 
like image 83
jpp Avatar answered Sep 28 '22 05:09

jpp