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

如何防止TypeError:将python列表复制到numpy数组时,列表索引必须是整数,而不是元组?,python,numpy,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]) mean_data = np.array(mean_data) 当我尝试运行该程序时,我得到错误: TypeError: list indices must be int

我正在尝试使用另一个名为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])
mean_data = np.array(mean_data)
当我尝试运行该程序时,我得到错误:

TypeError: list indices must be integers, not tuple
平均值数据列表类似于此示例

[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]]
我不知道如何防止这个错误,我尝试过将mean_数据创建为np.array并使用np.append向其添加值,但这也不能解决问题

这是回溯(以前使用过ipython)

这方面的回溯是:

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
索引器错误回溯(最近一次调用)
在()
31个采样点=(数据[:,0]==ur)和(数据[:,1]==ua)
32如果samepoints.sum()大于1:#检查是否有多个匹配项
--->33 np.追加(平均值\数据[ur,ua,np.平均值(数据[samepoints,-1]))
34 elif samepoints.sum()==1:
35 np.追加(平均数据[ur,ua,数据[samepoints,-1]]
索引器:索引无效

np.append需要数组作为第一个参数,要追加的列表作为第二个参数:

mean_data = np.append(mean_data, [ur, ua, np.mean(data[samepoints,-1])])
编辑

出现
无效索引
错误的原因是
平均值数据
和要添加的值之间缺少逗号

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

返回:append:ndarray

带有附加到轴上的值的arr副本。请注意,追加并没有就地发生:分配并填充了一个新数组。如果“轴”为“无”,则“输出”为展平阵列

因此,您必须将
np.append
结果分配给数组(我认为可以是
mean_data
本身),,因为您不需要展开的数组,所以还必须指定要追加的轴

考虑到这一点,我想你可以试试

mean_data = np.append(mean_data, [[ur, ua, np.mean(data[samepoints,-1])]], axis=0)

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

变量
mean_data
是一个嵌套列表,在Python中,访问嵌套列表不能通过多维切片来完成,即:
mean_data[1,2]
,相反,人们会写
平均数据[1][2]

这是因为
平均数据[2]
是一个列表。进一步的索引是递归进行的-因为
mean_data[2]
是一个列表,
mean_data[2][0]
是该列表的第一个索引

此外,
mean_data[:][0]
不起作用,因为
mean_data[:]
返回
mean_data

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

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

numpy数组(与MATLAB数组类似,与嵌套列表不同)支持使用元组进行多维切片。

您可能不需要创建列表并附加它们来创建数组。您可以一次完成所有操作,这会更快,因为您可以使用numpy来完成循环,而不是在纯python中自己完成循环

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

R = np.array(mean_data)[:,0]
而不是

R = np.array(mean_data[:,0])
但是,假设mean_数据有一个形状
nx3
,而不是

R = np.array(mean_data)[:,0]
P = np.array(mean_data)[:,1]
Z = np.array(mean_data)[:,2]
你可以简单地做

A = np.array(mean_data).mean(axis=0)
它在
0
th轴上求平均值,并返回一个长度
n
数组


但就我的原意而言,我将编造一些数据,试图说明如何做到这一点,而无需一次一项地构建任何列表:

如果有人遇到此问题,而没有执行
列表[索引,子索引]
,那么您可能会遇到问题,因为数组中的两个数组之间缺少逗号(这件事发生在我身上。)

说真的,这花了我很多宝贵的时间,但没有找到解决办法。 基本上,如果您是从sql获取数据,那么您是在转换数据,那么您可以遵循以下步骤

rows = cursor.fetchall()---- only tried on single column
dataset=[]
for x in rows:
    dataset.append(float(x[0]))

mean\u data[:,0]
的作用是什么?为什么那里有一个逗号?
mean\u data
是一个列表,因此不允许使用语法
[:,0]
您可以用于数组。您是如何尝试将其制作成数组的?我认为这将使您更接近解决方案。最好将
平均值数据
转换为数组本身,而不是复制它:
平均值数据=np.asarray(平均值数据)
(当然,这仍然会复制数据,但当旧变量可能不需要时,它不会创建新变量)谢谢!这是我的实际问题
rows = cursor.fetchall()---- only tried on single column
dataset=[]
for x in rows:
    dataset.append(float(x[0]))