如何在python中为循环建立数组索引?

时间:2019-04-18 00:34:00

标签: python numpy for-loop variables

我已经检查了一些以前的问题,但是似乎并没有得到答案,尽管如果之前有人问过我也不会感到惊讶。我想对我使用for循环建立索引的数组元素进行一些计算。

我有两个数组:

    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 ]

我遍历我的frames数组,但想迭代地对S数组中的单个值(用i索引)执行计算:

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

但是我遇到了界外错误,('索引9超出了尺寸1为9的轴1'),因为我索引到了帧的末尾。我尝试过:

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

那不起作用-是因为我的语法错误或我的逻辑错误。

我也尝试过:

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

并获得相同的越界错误。

编辑:我相信我可以以这种方式调用S,因为我可以在脚本的其他位置调用S(并且可以为i赋任何整数,并且脚本可以运行)。我关于使用i作为索引的逻辑是错误的。

4 个答案:

答案 0 :(得分:2)

使用您定义的两个列表(您写了arrays,但是对代码进行复制n粘贴会产生列表):

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

您不能对列表使用[:,i]索引。

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

使用frames会错过S的第一个元素,而最后一个索引会出错。 Python索引从0开始!

即使我创建了一个numpy数组,您的索引编制也是错误的:

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

IndexError: too many indices for array

arr为1d,形状为(9,)。您不能与此同时使用[:,i]`。

是否要选择S(或arr)的一部分,例如前三个元素?

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]索引一个slice(用于列表和数组)

如果数组为2d,则可以使用[:,i]表示法:

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.])

答案 1 :(得分:0)

我个人认为您不需要使用frames来索引S。 您可以尝试这种方式:

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

答案 2 :(得分:0)

您可以在帧数组中删除“ 9”,结果如下:

23.3
34.2
235
23.1
32.1
23
75
4

因此,现在您知道数组索引从0开始,而不是从1开始。 如果要解决此问题,则需要替换框架数组:

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

答案 3 :(得分:0)

您还有一个逗号。

尝试一下:

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

我的测试:

$ 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]
>>>