IndexError: занадто багато індексів для масиву

Я знаю, що існує безліч таких тем, але всі вони для дуже простих випадків, таких як матриці 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 (тобто один файл).

Коментарі (0)

Повідомлення, яке ви отримуєте, не стосується стандартного виключення 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, оскільки підтримує багатовимірні масиви.

Коментарі (0)