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:数组的索引过多的主要内容,如果未能解决你的问题,请参考以下文章
IndexError:数组的索引过多。具有 42 个特征的 Numpy 数组不均匀