MeC
MeC

Reputation: 463

How to index within array in python for loop?

I've checked some previous questions but can't quite seem to get an answer, though I wouldn't be surprised if this has been asked before. I would like to perform some calculations on elements of an array that I index using a for loop.

I have two arrays:

    S = [[4.21287783e-03 7.83625813e-03 1.42038926e-02 ... 3.15416197e-03
      1.37110355e-03 9.45473448e-04]
     [1.94774282e-03 1.36746081e-03 1.23485391e-03 ... 6.21054272e-04
      5.31808587e-04 1.78796272e-04]
     [1.20601337e-03 2.81822793e-04 6.32125664e-04 ... 2.72966598e-04
      3.88162201e-04 1.89432902e-04]
     ...
     [7.39537451e-05 1.20665168e-04 1.54863119e-04 ... 3.05247233e-04
      2.26473099e-04 1.56650857e-04]
     [9.29507556e-05 6.45091024e-05 9.84829924e-05 ... 3.07827294e-04
      2.33815251e-04 1.52187484e-04]
     [4.66322444e-05 3.16681323e-05 7.08467828e-05 ... 1.44890351e-04
      7.91870831e-05 5.80408583e-05]]

    frames = [ 1  2  3  4  5  6  7  8  9 ]

I iterate through my frames array, but want to iteratively perform a calculation on a single value (indexed with i) from the S array:

    for i in frames:
          np.log(S[:,i])

But I get an out-of-bounds error, ('index 9 is out of bounds for axis 1 with size 9') because i indexes to the end of frames. I tried:

    np.log(S[:,(i-1)])

which didn't work - either because my syntax is wrong or my logic is wrong.

I also tried:

      for i in frames:
          i=i-1
          np.log(S[:,i])

And get the same out of bounds error.

EDIT: I am confident that I can call S in this manner because I do so elsewhere in the script (and can sub in any integer for i and the script runs). My logic about using i as an index is wrong.

Upvotes: 0

Views: 1157

Answers (4)

hpaulj
hpaulj

Reputation: 231355

With the two lists that you define (you write about arrays but a copy-n-paste of your code produces lists):

In [30]: S = [23, 23.3, 34.2, 235, 23.1, 32.1, 23, 75, 4] 
    ...: frames = [1, 2, 3, 4, 5, 6, 7, 8, 9]                                        
In [31]: for i in frames: 
    ...:     print(S[:,i]) 
    ...:                                                                             
TypeError: list indices must be integers or slices, not tuple

You can't use [:,i] indexing with lists.

In [32]: for i in frames: 
    ...:     print(S[i]) 
    ..:                                                                             
23.3
34.2
235
23.1
32.1
23
75
4
---------------------------------------------------------------------------
IndexError: list index out of range

With frames you miss the first element of S, and get an error with the last index. Python indexing starts with 0!

Even if I make a numpy array your indexing is wrong:

In [33]: arr = np.array(S)                                                           
In [34]: for i in frames: 
    ...:     print(arr[:,i]) 
    ...:                                                                             

IndexError: too many indices for array

arr is 1d, shape (9,). You can't use [:,i]` with that.

Do you want to select a part of S (or arr), for example the first the 3 elements?

In [36]: arr[:3]                                                                     
Out[36]: array([23. , 23.3, 34.2])
In [37]: np.log(arr[:3])                                                             
Out[37]: array([3.13549422, 3.14845336, 3.53222564])

[:3] indexes a slice (both for list and arrays)

If the array is 2d, then you can use the [:,i] notation:

In [38]: A = arr.reshape(3,3)                                                        
In [39]: A                                                                           
Out[39]: 
array([[ 23. ,  23.3,  34.2],
       [235. ,  23.1,  32.1],
       [ 23. ,  75. ,   4. ]])
In [40]: A[:,0]                       # first column                                               
Out[40]: array([ 23., 235.,  23.])

Upvotes: 2

haofeng
haofeng

Reputation: 651

Personally, I think you dont need to use frames to index S. You can try this way:

for i in range(S.shape[0])
    np.log(S[i])

Upvotes: 0

Alfa Cento
Alfa Cento

Reputation: 1

You have an extra comma.

Try this:

for i in frames:
      np.log(S[:i])

My test:

$ python3
Python 3.7.2+ (default, Feb 27 2019, 15:41:59) 
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> S = [23, 23.3, 34.2, 235, 23.1, 32.1, 23, 75, 4]
>>> frames = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for i in frames:
...     print(S[:i])
... 
[23]
[23, 23.3]
[23, 23.3, 34.2]
[23, 23.3, 34.2, 235]
[23, 23.3, 34.2, 235, 23.1]
[23, 23.3, 34.2, 235, 23.1, 32.1]
[23, 23.3, 34.2, 235, 23.1, 32.1, 23]
[23, 23.3, 34.2, 235, 23.1, 32.1, 23, 75]
[23, 23.3, 34.2, 235, 23.1, 32.1, 23, 75, 4]
>>> 

Upvotes: 0

Martin
Martin

Reputation: 1

You can remove "9" in frames array, and you will see the result as below:

23.3
34.2
235
23.1
32.1
23
75
4

So now you know the array index starts from 0, not from 1. if you want to fix that, you need to replace the frames array:

frames = [0, 1, 2, 3, 4, 5, 6, 7, 8]

Upvotes: 0

Related Questions