IndexError:数组的索引过多

Posted

技术标签:

【中文标题】IndexError:数组的索引过多【英文标题】:IndexError: too many indices for array 【发布时间】:2015-03-18 04:15:49 【问题描述】:

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

所以这里是有问题的代码:

# 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

我了解第一个错误,但在修复它时遇到了问题。不过,第二个错误让我感到困惑。我的老板真的在我的脖子上呼吸,所以任何帮助将不胜感激!

【问题讨论】:

数组从零开始,12 元素数组中没有索引 12 您是否尝试将print data 放在for data,color in zip(outputs_l1, colors): 之后以查看每行数据的样子?似乎它可能没有按照您期望的方式格式化(您认为它将是一个由 14 个元素组成的数组,对吧?看起来有些情况下只有 12 个元素) 当我输入“打印数据”或“打印输出_l1”时,它表示这些语法无效。并且有 14 个参数,所以最后两个参数将是 #12 和 #13,这就是我在图表中所要求的。您在哪里看到只有 12 个的实例?那是我之前的问题,我以为我已经解决了,但我可能错过了一些东西 您使用的是 Python 3.x 吗?在这种情况下,它应该是print(data)IndexError: index 12 is out of bounds for axis 1 with size 12 明确表示某处有一个仅包含 12 个元素的数据行。 【参考方案1】:

您收到的消息不是 Python 的默认异常:

对于一个新的 python 列表,IndexError 仅在索引不在范围内时抛出(即使docs 这么说)。

>>> 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 that internally uses numpy 来处理数组。在深入挖掘codebase for 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 不同,Numpy 引发 IndexError 因为它支持多维数组。

【讨论】:

【参考方案2】:

我认为错误信息中给出了问题,虽然不是很容易发现:

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

'Too many indices' 意味着你给出了太多的索引值。您已经给出了 2 个值,因为您期望数据是 2D 数组。 Numpy 抱怨是因为 data 不是 2D(它是 1D 或 None)。

这有点猜测 - 我想知道您传递给 loadfile() 的文件名之一是指向一个空文件,还是一个格式错误的文件?如果是这样,您可能会得到一个返回的数组,它要么是一维的,要么是空的(np.array(None) 不会抛出 Error,所以你永远不会知道......)。如果你想防止这种失败,你可以在 loadfile 函数中插入一些错误检查。

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

print(data)

这适用于 Python 2.x 或 3.x,并可能揭示问题的根源。您很可能会发现只是您的 outputs_l1 列表(即一个文件)中的一个值导致了问题。

【讨论】:

以上是关于IndexError:数组的索引过多的主要内容,如果未能解决你的问题,请参考以下文章

SVC 的网格搜索:IndexError:数组索引过多

IndexError:数组的索引过多

IndexError:数组的索引过多。具有 42 个特征的 Numpy 数组不均匀

IndexError:创建均匀粒子时数组的索引过多

尝试计算 numpy 数组列中的唯一项时出现“IndexError:数组索引过多”

IndexError:使用 scikit-learn 绘制 ROC 曲线时数组索引过多?