我已经检查了一些以前的问题,但是似乎并没有得到答案,尽管如果之前有人问过我也不会感到惊讶。我想对我使用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作为索引的逻辑是错误的。
答案 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]
>>>