Chr*_*ris 54 python csv indexing error-handling excel
我知道有很多这些线程,但它们都是非常简单的情况,如3x3矩阵和那种类型的东西,解决方案甚至没有开始适用于我的情况.所以我试图将G与l1(这不是十一,而是一个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)
Run Code Online (Sandbox Code Playgroud)
运行整个程序后,我收到错误消息:
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
Run Code Online (Sandbox Code Playgroud)
在我遇到这个问题之前,我有另一个涉及上面错误消息引用的一行以下的行:
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
Run Code Online (Sandbox Code Playgroud)
我理解第一个错误,但我只是修复它有问题.第二个错误让我感到困惑.我的老板真的在我的脖子上呼吸,所以任何帮助都会非常感激!
J R*_*ape 51
我认为问题在错误消息中给出,尽管发现它并不容易:
IndexError: too many indices for array
xs = data[:, col["l1" ]]
Run Code Online (Sandbox Code Playgroud)
"索引太多"意味着你给出的索引值太多了.您已经给出了2个值,因为您期望数据是2D数组.Numpy抱怨因为data
不是2D(它是1D或None).
这是一个猜测 - 我想知道你传递给loadfile()的文件名之一是指向空文件还是格式错误的文件?如果是这样,你可能会得到一个返回的数组,它是1D,甚至是空的(np.array(None)
不抛出Error
,所以你永远不会知道......).如果要防止此故障,可以在loadfile
函数中插入一些错误检查.
我强烈推荐你的for
循环插入:
print(data)
Run Code Online (Sandbox Code Playgroud)
这将在Python 2.x或3.x中工作,并可能揭示问题的根源.您可能会发现它只是outputs_l1
列表中的一个值(即一个文件).
您收到的消息不适用于 Python 的默认异常:
对于新的 python 列表,IndexError
仅在索引不在范围内时抛出(甚至文档也这么说)。
>>> l = []
>>> l[1]
IndexError: list index out of range
Run Code Online (Sandbox Code Playgroud)
如果我们尝试将多个项目传递给列表或其他一些值,我们会得到TypeError
:
>>> l[1, 2]
TypeError: list indices must be integers, not tuple
>>> l[float('NaN')]
TypeError: list indices must be integers, not float
Run Code Online (Sandbox Code Playgroud)
但是,在这里,您似乎正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
其中,如果索引的大小大于结果的大小, unpack 方法将抛出错误。
因此,与 PythonTypeError
在不正确的索引上引发 a 不同,Numpy 引发 是IndexError
因为它支持多维数组。