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

2024-04-19 06:09:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用另一个名为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])

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

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

我不知道如何防止这个错误,我试着创建一个np.array的mean_数据,并使用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

另一种创建数组的方法是:

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

其回溯是:

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

Tags: 数据in列表dataif错误np数组
3条回答
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

编辑

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

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

Returns : append : ndarray

A copy of arr with values appended to axis. Note that append does not occur in-place: a new array is allocated and filled. If axis is None, out is a flattened array.

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

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

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

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

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

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

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

而不是

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

但是,假设平均数据有一个形状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轴上平均,并返回一个长度-n数组

但就我最初的观点而言,我将编造一些数据,试图说明如何在不构建任何列表的情况下做到这一点一次一个项目:

变量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)

numpy数组(类似于MATLAB数组,不同于嵌套列表)支持元组的多维切片。

相关问题 更多 >