Я знаю, что есть тонна подобных тем, но все они для очень простых случаев, таких как матрицы 3x3 и тому подобное, и решения даже не начинают применяться к моей ситуации. Итак, я пытаюсь построить график зависимости G от l1 (это не одиннадцать, а L1). Данные находятся в файле, который я загрузил из файла excel. Файл excel имеет размер 14x250, так что есть 14 аргументов, каждый с 250 точками данных. Другой пользователь (крик Хью Ботвеллу!) помог мне с ошибкой в моем коде, но теперь всплыла другая ошибка.
Вот код, о котором идет речь:
# 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" ]]
'Too many indices' означает, что вы задали слишком много значений индексов. Вы указали 2 значения, так как ожидаете, что данные будут двумерным массивом. Numpy жалуется, потому что data
не двумерный (он либо 1D, либо None).
Это небольшое предположение - интересно, если одно из имен файлов, которые вы передаете в loadfile(), указывает на пустой или плохо отформатированный файл? Если да, то вы можете получить в ответ массив, который либо 1D, либо вообще пустой (np.array(None)
не выбрасывает Error
, так что вы никогда не узнаете...). Если вы хотите защититься от этой ошибки, вы можете вставить некоторую проверку ошибок в функцию loadfile
.
Я настоятельно рекомендую вставить в ваш цикл for
:
print(data)
Это будет работать в Python 2.x или 3.x и может выявить источник проблемы. Вполне возможно, вы обнаружите, что проблема заключается только в одном значении списка outputs_l1
(т.е. в одном файле).
Сообщение, которое вы получаете, не относится к стандартному исключению Python:
Для свежего списка python, IndexError
выбрасывается только в случае, если индекс не находится в диапазоне (даже в docs об этом говорится).
>>> l = []
>>> l[1]
IndexError: list index out of range
Если мы попытаемся передать в list несколько элементов или какое-то другое значение, мы получим 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;
}
где метод распаковки выдаст ошибку, если размер индекса будет больше, чем размер результатов.
Таким образом, в отличие от Python, который выдает TypeError
при неправильных индексах, Numpy выдает IndexError
, поскольку поддерживает многомерные массивы.