Я знаю, що існує безліч таких тем, але всі вони для дуже простих випадків, таких як матриці 3х3 і тому подібне, і їх рішення навіть не починають застосовуватися до моєї ситуації. Отже, я намагаюсь побудувати графік 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" ]]
Занадто багато індексів означає, що ви ввели занадто багато значень індексів. Ви ввели 2 значення, оскільки очікуєте, що дані будуть двовимірним масивом. Numpy скаржиться, тому що "дані" не є двовимірними (вони або 1D, або None).
Це невелике припущення - цікаво, чи не вказує одне з імен файлів, які ви передаєте в loadfile(), на порожній файл, або на погано відформатований? Якщо так, то ви можете отримати масив, який буде або одномірним, або навіть порожнім (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
Якщо ми спробуємо передати декілька елементів у список, або якесь інше значення, то отримаємо 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
, оскільки підтримує багатовимірні масиви.