IndexError:数组索引过多


75

我知道有很多这样的线程,但是它们都是用于非常简单的情况(例如3x3矩阵)之类的,解决方案甚至还没有开始应用于我的情况。因此,我尝试绘制G与l1的关系图(这不是11,而是L1)。数据在我从excel文件加载的文件中。excel文件为14x250,因此有14个参数,每个参数包含250个数据点。我有另一个用户(向休·博斯韦尔大喊大叫!)帮助我解决代码中的错误,但现在又出现了另一个错误。

所以这是有问题的代码:

# format for CSV file:
header = ['l1', 'l2', 'l3', 'l4', 'l5', 'EI',
      'S', 'P_right', 'P1_0', 'P3_0',
      'w_left', 'w_right', 'G_left', 'G_right']

def loadfile(filename, skip=None, *args):
    skip = set(skip or [])
    with open(filename, *args) as f:
        cr = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC)
        return np.array(row for i,row in enumerate(cr) if i not in skip)
#plot data
outputs_l1 = [loadfile('C:\\Users\\Chris\\Desktop\\Work\\Python Stuff\\BPCROOM - Shingles analysis\\ERR analysis\\l_1 analysis//BS(1) ERR analysis - l_1 - P_3 = {}.csv'.format(p)) for p in p3_arr]

col = {name:i for i,name in enumerate(header)}

fig = plt.figure()
for data,color in zip(outputs_l1, colors):
    xs  = data[:, col["l1"     ]]
    gl = data[:, col["G_left" ]] * 1000.0    # column 12
    gr = data[:, col["G_right"]] * 1000.0    # column 13
    plt.plot(xs, gl, color + "-", gr, color + "--")
for output, col in zip(outputs_l1, colors):
    plt.plot(output[:,0], output[:,11]*1E3, col+'--')
plt.ticklabel_format(axis='both', style='plain', scilimits=(-1,1))
plt.xlabel('$l1 (m)$')
plt.ylabel('G $(J / m^2) * 10^{-3}$')
plt.xlim(xmin=.2)
plt.ylim(ymax=2, ymin=0)

plt.subplots_adjust(top=0.8, bottom=0.15, right=0.7)

运行整个程序后,我收到错误消息:

Traceback (most recent call last):
  File "C:/Users/Chris/Desktop/Work/Python Stuff/New Stuff from Brenday 8 26 2014/CD_ssa_plot(2).py", line 115, in <module>
    xs  = data[:, col["l1"     ]]
IndexError: too many indices for array

在遇到这个问题之前,我在上面的错误消息所指的行的下面几行涉及:

Traceback (most recent call last): File "FILE", line 119, in <module> 
gl = data[:, col["G_left" ]] * 1000.0 # column 12 
IndexError: index 12 is out of bounds for axis 1 with size 12

我了解第一个错误,但是在解决它时遇到了问题。第二个错误对我来说却令人困惑。我的老板真的在呼吸我的脖子,所以任何帮助将不胜感激!


1
数组是从零开始的,在12个元素的数组中没有索引12
Padraic Cunningham

你有没有试图把print datafor data,color in zip(outputs_l1, colors):即可查看每个像数据长相行?似乎它可能未按照您期望的方式进行格式化(您的信念是它将由14个元素组成,对吗?看起来好像只有12个元素)
zehnpaard

当我键入“打印数据”或“打印输出_l1”时,它表示这些语法无效。并且有14个参数,所以最后两个将是#12和#13,这就是我在图上调用的内容。您在哪里看到只有12个实例?那是我以前的问题,我以为我已经解决了,但是我可能错过了一些东西
克里斯(Chris

您在使用Python 3.x吗?在这种情况下,应该print(data)改为。 IndexError: index 12 is out of bounds for axis 1 with size 12很明显,某处有一个仅包含12个元素的数据行。
zehnpaard 2015年

Answers:


66

我认为问题出在错误消息中,尽管不是很容易发现:

IndexError: too many indices for array
xs  = data[:, col["l1"     ]]

“索引太多”意味着您给出的索引值太多。您已给定2个值,因为您希望数据为2D数组。Numpy抱怨是因为data不是2D(不是1D就是“无”)。

这有点猜测-我想知道您传递给loadfile()的文件名之一是指向空文件还是格式错误的文件?如果是这样,您可能会返回一个1D甚至为空的数组(np.array(None)不会抛出Error,因此您永远不会知道...)。如果要防止这种故障,可以在loadfile函数中插入一些错误检查。

我强烈建议您在for循环插入中:

print(data)

这将在Python 2.x或3.x中运行,并且可能揭示问题的根源。您可能会发现,outputs_l1导致该问题的只是列表的一个值(即一个文件)。


5

您收到的消息不是针对Python的默认Exception的:

对于新的python列表,IndexError仅在不在范围内的索引上抛出(即使文档也是如此)。

>>> l = []
>>> l[1]
IndexError: list index out of range

如果我们尝试将多个项目传递到列表或其他某个值,则会得到TypeError

>>> l[1, 2]
TypeError: list indices must be integers, not tuple

>>> l[float('NaN')]
TypeError: list indices must be integers, not float

但是,在这里,您似乎在matplotlib内部使用它numpy来处理数组。在深入研究的代码库时numpy,我们看到:

static NPY_INLINE npy_intp
unpack_tuple(PyTupleObject *index, PyObject **result, npy_intp result_n)
{
    npy_intp n, i;
    n = PyTuple_GET_SIZE(index);
    if (n > result_n) {
        PyErr_SetString(PyExc_IndexError,
                        "too many indices for array");
        return -1;
    }
    for (i = 0; i < n; i++) {
        result[i] = PyTuple_GET_ITEM(index, i);
        Py_INCREF(result[i]);
    }
    return n;
}

如果索引的大小大于结果的大小,则unpack方法将引发错误。

因此,与Python会TypeError在不正确的索引上引发的Python不同,Numpy会引发的IndexError原因是因为它支持多维数组。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.