如何防止TypeError:列表索引必须是整数,而不是在将python列表复制到numpy数组时的元组?

mar*_*ray 38 python numpy

我正在尝试使用另一个名为mean_data的数组创建3个numpy数组/列表,如下所示:

---> 39 R = np.array(mean_data[:,0])
     40 P = np.array(mean_data[:,1])
     41 Z = np.array(mean_data[:,2])
Run Code Online (Sandbox Code Playgroud)

当我尝试运行程序时,我收到错误:

TypeError: list indices must be integers, not tuple
Run Code Online (Sandbox Code Playgroud)

mean_data列表看起来像这个样本......

[6.0, 315.0, 4.8123788544375692e-06],
[6.5, 0.0, 2.259217450023793e-06],
[6.5, 45.0, 9.2823565008402673e-06],
[6.5, 90.0, 8.309270169336028e-06],
[6.5, 135.0, 6.4709418114245381e-05],
[6.5, 180.0, 1.7227922423558414e-05],
[6.5, 225.0, 1.2308522579848724e-05],
[6.5, 270.0, 2.6905672894824344e-05],
[6.5, 315.0, 2.2727114437176048e-05]]
Run Code Online (Sandbox Code Playgroud)

我不知道如何防止这个错误,我尝试创建mean_data作为np.array并使用np.append为其添加值但是这也没有解决问题.

这是追溯(之前使用的是ipython)

Traceback (most recent call last):
  File "polarplot.py", line 36, in <module>
    R = np.array(mean_data[:,0])
TypeError: list indices must be integers, not tuple
Run Code Online (Sandbox Code Playgroud)

我试图创建一个数组的另一种方式是:

mean_data = np.array([])

for ur, ua in it.product(uradius, uangle):
    samepoints = (data[:,0]==ur) & (data[:,1]==ua)
    if samepoints.sum() > 1:  # check if there is more than one match
        np.append(mean_data[ur, ua, np.mean(data[samepoints,-1])])
    elif samepoints.sum() == 1:
        np.append(mean_data, [ur, ua, data[samepoints,-1]])
Run Code Online (Sandbox Code Playgroud)

回溯就是:

IndexError                                Traceback (most recent call last)
<ipython-input-3-5268bc25e75e> in <module>()
     31     samepoints = (data[:,0]==ur) & (data[:,1]==ua)
     32     if samepoints.sum() > 1:  # check if there is more than one match
---> 33         np.append(mean_data[ur, ua, np.mean(data[samepoints,-1])])
     34     elif samepoints.sum() == 1:
     35         np.append(mean_data, [ur, ua, data[samepoints,-1]])

IndexError: invalid index
Run Code Online (Sandbox Code Playgroud)

mba*_*ano 29

该变量mean_data是一个嵌套列表,在Python中访问嵌套列表不能通过多维切片来完成,即:mean_data[1,2]而不是一个人会写mean_data[1][2].

这是因为mean_data[2]是一个列表.进一步索引是递归完成的 - 因为mean_data[2]是列表,mean_data[2][0]是该列表的第一个索引.

此外,mean_data[:][0]因为mean_data[:]返回而无效mean_data.

解决方案是替换数组,或导入原始数据,如下所示:

mean_data = np.array(mean_data)
Run Code Online (Sandbox Code Playgroud)

numpy数组(如MATLAB数组和嵌套列表不同)支持使用元组进行多维切片.

  • 最好将 `mean_data` 本身转换为数组而不是复制它:`mean_data = np.asarray(mean_data)`(当然,这仍然会复制数据,但是当旧变量可能出现时它不会创建新变量并不需要) (2认同)

ask*_*han 11

您可能不需要制作列表并附加它们来制作阵列.你可以一次完成所有这一切,这更快,因为你可以使用numpy来做你的循环,而不是自己在纯python中做它们.

要像其他人所说的那样回答你的问题,你就不能像你那样访问带有两个索引的嵌套列表.如果您mean_data在尝试切片之前转换为数组,则可以:

R = np.array(mean_data)[:,0]
Run Code Online (Sandbox Code Playgroud)

代替

R = np.array(mean_data[:,0])
Run Code Online (Sandbox Code Playgroud)

但是,假设mean_data有一个形状nx3,而不是

R = np.array(mean_data)[:,0]
P = np.array(mean_data)[:,1]
Z = np.array(mean_data)[:,2]
Run Code Online (Sandbox Code Playgroud)

你可以干脆做

A = np.array(mean_data).mean(axis=0)
Run Code Online (Sandbox Code Playgroud)

它在第0th轴上平均并返回长度n数组

但就我原来的观点而言,我将编写一些数据来试图说明如何在不构建任何列表的情况下一次执行此操作:


lms*_*fan 6

import numpy as np

mean_data = np.array([
[6.0, 315.0, 4.8123788544375692e-06],
[6.5, 0.0, 2.259217450023793e-06],
[6.5, 45.0, 9.2823565008402673e-06],
[6.5, 90.0, 8.309270169336028e-06],
[6.5, 135.0, 6.4709418114245381e-05],
[6.5, 180.0, 1.7227922423558414e-05],
[6.5, 225.0, 1.2308522579848724e-05],
[6.5, 270.0, 2.6905672894824344e-05],
[6.5, 315.0, 2.2727114437176048e-05]])

R = mean_data[:,0]
print R
print R.shape
Run Code Online (Sandbox Code Playgroud)

编辑

出现invalid index错误的原因是mean_data您要添加的值之间缺少逗号。

此外, np.append 返回数组的副本,并且不会更改原始数组。从文档:

返回:追加:ndarray

将值附加到轴的 arr 副本。请注意,追加不会就地发生:分配并填充一个新数组。如果axis 为None,则out 是一个扁平数组。

因此,您必须将np.append结果分配给一个数组(mean_data我认为可以是它本身),并且,由于您不想要扁平数组,因此您还必须指定要附加的轴。

考虑到这一点,我认为你可以尝试类似

mean_data = np.append(mean_data, [[ur, ua, np.mean(data[samepoints,-1])]], axis=0)
Run Code Online (Sandbox Code Playgroud)

看看加倍的[[]]:我认为它们是必要的,因为两个数组必须具有相同的形状。