67

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

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

我不知道如何防止此错误,我尝试将 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

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

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
4

7 回答 7

79

该变量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 数组,与嵌套列表不同)支持使用元组进行多维切片。

于 2013-04-08T17:03:51.763 回答
15

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

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

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

代替

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

但是,假设 mean_data 有一个 shape 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)

在 th 轴上取平均值0并返回一个长度n数组

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

于 2013-04-08T20:06:32.547 回答
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

编辑

出现错误的原因是与要添加的值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)

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

于 2013-04-08T16:57:58.263 回答
2

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

mean_data = np.append(mean_data, [ur, ua, np.mean(data[samepoints,-1])])
于 2013-04-08T16:54:52.160 回答
2

如果有人遇到这个问题并且没有完成list[index, sub-index],那么您可能会遇到问题,因为您在数组数组中的两个数组之间缺少逗号(它发生在我身上)。

于 2018-02-21T17:16:00.590 回答
0

说真的,这花了我很多宝贵的时间,但没有找到解决方案。基本上,如果您从 sql 获取数据,那么您正在转换,那么您可以按照以下步骤操作。

rows = cursor.fetchall()---- only tried on single column
dataset=[]
for x in rows:
    dataset.append(float(x[0]))
于 2020-08-19T07:52:03.397 回答
0

试试这个 :

R = np.array(mean_data[:][0])
P = np.array(mean_data[:][1])
Z = np.array(mean_data[:][2])
于 2021-10-12T17:08:14.393 回答