it-swarm.com.de

IndexError: zu viele Indizes für Array

Ich weiß, dass es eine Tonne dieser Threads gibt, aber alle sind für sehr einfache Fälle wie 3x3-Matrizen und solche Dinge gedacht, und die Lösungen treffen nicht einmal auf meine Situation zu. Also versuche ich, G gegen l1 zu zeichnen (das ist keine elf, sondern eine L1). Die Daten befinden sich in der Datei, die ich aus einer Excel-Datei geladen habe. Die Excel-Datei hat eine Größe von 14 x 250, dh es gibt 14 Argumente mit jeweils 250 Datenpunkten. Ich hatte einen anderen Benutzer (rufen Sie Hugh Bothwell an!), Der mir mit einem Fehler in meinem Code half, aber jetzt ist ein anderer Fehler aufgetaucht.

Also hier ist der fragliche Code:

# 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)

Nach dem Ausführen des gesamten Programms erhalte ich die Fehlermeldung:

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

und bevor ich auf dieses Problem stieß, hatte ich ein anderes, das die Zeile ein paar unter der einbezog, auf die sich die obige Fehlermeldung bezieht:

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

Ich verstehe den ersten Fehler, habe aber nur Probleme, ihn zu beheben. Der zweite Fehler ist allerdings verwirrend für mich. Mein Chef atmet wirklich meinen Nacken hinunter, also wäre jede Hilfe SEHR dankbar!

52
Chris

Ich denke, das Problem ist in der Fehlermeldung angegeben, obwohl es nicht leicht zu erkennen ist:

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

"Zu viele Indizes" bedeutet, dass Sie zu viele Indexwerte angegeben haben. Sie haben 2 Werte angegeben, da Sie davon ausgehen, dass es sich bei den Daten um ein 2D-Array handelt. Numpy beschwert sich, weil data nicht 2D ist (es ist entweder 1D oder None).

Dies ist eine kleine Vermutung - ich frage mich, ob einer der Dateinamen, die Sie an loadfile () übergeben, auf eine leere oder eine schlecht formatierte Datei verweist. In diesem Fall wird möglicherweise ein Array zurückgegeben, das entweder 1D oder sogar leer ist (np.array(None) wirft kein Error, sodass Sie es niemals wissen würden ...). Wenn Sie sich gegen diesen Fehler schützen möchten, können Sie in Ihre Funktion loadfile eine Fehlerüberprüfung einfügen.

Ich empfehle dringend, in Ihrer for -Schleife Folgendes einzufügen:

print(data)

Dies funktioniert in Python 2.x oder 3.x und gibt möglicherweise die Ursache des Problems an. Möglicherweise ist dies nur ein Wert in Ihrer outputs_l1 - Liste (d. H eine Datei), die das Problem gibt.

49
J Richard Snape

Die Meldung, die Sie erhalten, gilt nicht für die Standardausnahme von Python:

Für eine neue python list, IndexError wird nur auf einen Index geworfen, der nicht im Bereich liegt (gerade docs sag es) .

>>> l = []
>>> l[1]
IndexError: list index out of range

Wenn wir versuchen, mehrere Elemente an list oder einen anderen Wert zu übergeben, erhalten wir den TypeError:

>>> l[1, 2]
TypeError: list indices must be integers, not Tuple

>>> l[float('NaN')]
TypeError: list indices must be integers, not float

Anscheinend verwenden Sie hier jedoch matplotlib, das intern numpy verwendet für die Behandlung von Arrays. Beim tieferen Durchstöbern der Codebasis für numpy sehen wir:

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;
}

wobei die Entpack-Methode einen Fehler auslöst, wenn die Größe des Index größer als die der Ergebnisse ist.

Im Gegensatz zu Python, das TypeError für falsche Indizes auslöst, löst Numpy IndexError aus, weil es mehrdimensionale Arrays unterstützt.

0
mu 無