Подтвердить что ты не робот

IndexError: слишком много индексов для массива

Я знаю, что есть тонна этих потоков, но все они предназначены для очень простых случаев, таких как матрицы 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

Я понимаю первую ошибку, но у меня просто проблемы с ее исправлением. Вторая ошибка меня сбивает с толку. Мой босс действительно дышит мне на шею, поэтому любая помощь будет НАСТОЯТЕЛЬНО оценена!

4b9b3361

Ответ 1

Я думаю, что проблема указана в сообщении об ошибке, хотя это не очень легко заметить:

IndexError: too many indices for array
xs  = data[:, col["l1"     ]]

"Слишком много индексов" означает, что вы указали слишком много значений индекса. Вы указали 2 значения, поскольку ожидаете, что данные будут 2D-массивом. Numpy жалуется, потому что data не является 2D (это либо 1D, либо None).

Это немного догадка - интересно, если один из имен файлов, которые вы передаете loadfile(), указывает на пустой файл или плохо отформатированный? Если это так, вы можете получить возвращаемый массив, который является либо 1D, либо даже пустым (np.array(None) не выбрасывает Error, поэтому вы никогда не узнаете...). Если вы хотите защитить от этого сбоя, вы можете вставить некоторую ошибку в свою функцию loadfile.

Я настоятельно рекомендую вставлять петлю for:

print(data)

Это будет работать в Python 2.x или 3.x и может выявить источник проблемы. Возможно, вы обнаружите, что это единственное значение вашего списка outputs_l1 (то есть одного файла), который дает проблему.

Ответ 2

Полученное сообщение не относится к исключению Python по умолчанию:

Для нового списка Python IndexError генерируется только для индекса, который не находится в диапазоне (даже документы говорят так).

>>> 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, потому что он поддерживает многомерные массивы.