我知道有很多这样的线程,但它们都适用于非常简单的情况,例如 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
我理解第一个错误,但在修复它时遇到问题。但第二个错误让我感到困惑。我的老板真的对我很紧张,所以任何帮助将不胜感激!
我认为问题已在错误消息中给出,尽管不太容易发现:
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
列表(即一个文件)中的一个值导致了问题。
您收到的消息不是针对 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
因为它支持多维数组。
这个答案晚了 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
在将数据转换为列表之前,我将数据转换为列表
data = list(data) data = np.array(data)