IndexError:数组索引太多

问题描述 投票:0回答:4

我知道有很多这样的线程,但它们都适用于非常简单的情况,例如 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

我理解第一个错误,但在修复它时遇到问题。但第二个错误让我感到困惑。我的老板真的对我很紧张,所以任何帮助将不胜感激!

python excel csv error-handling indexing
4个回答
83
投票

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

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

“太多索引”意味着您给出了太多索引值。您已经给出了 2 个值,因为您期望数据是一个二维数组。 Numpy 正在抱怨,因为

data
不是 2D(它要么是 1D,要么是 None)。

这有点猜测 - 我想知道传递给 loadfile() 的文件名之一是否指向空文件,或者格式错误的文件?如果是这样,您可能会返回一个 1D 数组,甚至是空数组(

np.array(None)
不会抛出
Error
,所以您永远不会知道...)。如果您想防止这种失败,您可以在您的
loadfile
函数中插入一些错误检查。

我强烈建议您在

for
循环中插入:

print(data)

这适用于 Python 2.x 或 3.x,并可能揭示问题的根源。您可能会发现只有

outputs_l1
列表(即一个文件)中的一个值导致了问题。


12
投票

您收到的消息不是针对 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
,内部使用
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
不同,Numpy 引发
IndexError
因为它支持多维数组。


0
投票

这个答案晚了 9 年,但错误是由于 OP 使用

loadfile
定义中的生成器表达式创建数组,它返回 0 维 ndarray。

np.array(row for i,row in enumerate(cr) if i not in skip)    # <--- culprit

np.array([row for i,row in enumerate(cr) if i not in skip])  # <--- fix
#        ^                                               ^   # <--- create array from list

一般来说,

IndexError: too many indices for array
表示您尝试索引不存在的维度,例如尝试在 1D ndarray 中索引列,尝试在 2D ndarray 中索引第三维等。

# 1D ndarray: arr.ndim==1
arr = np.array([0, 1, 2])
arr[0]         # <--- OK
arr[:, 0]      # <--- IndexError: too many indices for array


# 2D ndarray: ary.ndim==2
ary = np.array([
    [1, 2],
    [3, 4]
])

ary[0]         # <--- OK
ary[:, 0]      # <--- OK
ary[:, :, 0]   # <--- IndexError: too many indices for array

另一方面,

IndexError: index 12 is out of bounds for axis 1 with size 12
表示虽然尺寸没问题,但您试图在 ndarray 的边界之外进行索引。由于 ndarray 是 0 索引的,为了索引最后一列,我们应该使用
-1
arr.shape[1]-1

# 1D ndarray of length 3
arr = np.array([0, 1, 2])
arr[2]      # <--- OK
arr[3]      # <--- IndexError: index 3 is out of bounds for axis 0 with size 3


# 2x2 ndarray
ary = np.array([
    [1, 2],
    [3, 4]
])

ary[:, 1]   # <--- OK
ary[:, -1]  # <--- OK
ary[:, 2]   # <--- IndexError: index 2 is out of bounds for axis 1 with size 2

-2
投票

在将数据转换为列表之前,我将数据转换为列表

 data = list(data) data = np.array(data)

© www.soinside.com 2019 - 2024. All rights reserved.