IndexError: Zu viele Indizes für Array

74

Ich weiß, dass es eine Menge dieser Threads gibt, aber alle sind für sehr einfache Fälle wie 3x3-Matrizen und solche Dinge gedacht, und die Lösungen gelten nicht einmal für meine Situation. Also versuche ich, G gegen l1 grafisch darzustellen (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 ist 14x250, es gibt also 14 Argumente mit jeweils 250 Datenpunkten. Ich hatte einen anderen Benutzer (rufen Sie Hugh Bothwell an!), Der mir bei einem Fehler in meinem Code half, aber jetzt ist ein weiterer Fehler aufgetreten.

Hier ist also 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 folgende 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 einige unter der Zeile betraf, 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 für mich allerdings verwirrend. Mein Chef atmet mir wirklich den Hals runter, also wäre jede Hilfe sehr dankbar!

Chris
quelle
1
Arrays basieren auf Null, es gibt keinen Index 12 in einem Array mit 12 Elementen
Padraic Cunningham
Haben Sie versucht, print datanachher for data,color in zip(outputs_l1, colors):zu setzen, um zu sehen, wie jede Datenzeile aussieht? Es scheint, als wäre es möglicherweise nicht so formatiert, wie Sie es erwarten (Sie glauben, dass es sich um ein Array von 14 Elementen handeln wird, oder? Es sieht so aus, als gäbe es Fälle, in denen es nur 12 Elemente gibt)
zehnpaard
Wenn ich 'print data' oder 'print output_l1' eingebe, heißt das, dass dies eine ungültige Syntax ist. und es gibt 14 Argumente, also werden die letzten beiden # 12 und # 13 sein, was ich für das Diagramm fordere. Und wo sehen Sie Fälle, in denen es nur 12 gibt? Das war mein Problem zuvor und ich dachte, ich hätte das behoben, aber ich habe vielleicht etwas verpasst
Chris
Verwenden Sie Python 3.x? in diesem Fall sollte es print(data)stattdessen sein. IndexError: index 12 is out of bounds for axis 1 with size 12ist explizit, dass es irgendwo eine Datenzeile gibt, die nur 12 Elemente enthält.
Zehnpaard

Antworten:

65

Ich denke, das Problem wird in der Fehlermeldung angegeben, obwohl es nicht sehr 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 erwarten, dass Daten ein 2D-Array sind. Numpy beschwert sich, weil dataes nicht 2D ist (es ist entweder 1D oder Keine).

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 Array Error, sodass Sie es nie erfahren würden ...). Wenn Sie sich vor diesem Fehler schützen möchten, können Sie eine Fehlerprüfung in Ihre loadfileFunktion einfügen .

Ich empfehle dringend, in Ihre forSchleife einzufügen:

print(data)

Dies funktioniert in Python 2.x oder 3.x und kann die Ursache des Problems aufdecken. Möglicherweise stellen Sie fest, dass nur ein Wert Ihrer outputs_l1Liste (dh eine Datei) das Problem verursacht.

J Richard Snape
quelle
5

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

Wird für eine neue Python-Liste IndexErrornur auf einen Index geworfen, der nicht in Reichweite liegt (selbst Dokumente sagen dies).

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

Wenn wir versuchen, mehrere Elemente an die Liste oder einen anderen Wert zu übergeben, erhalten wir Folgendes TypeError:

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

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

Hier scheinen Sie jedoch das zu verwenden matplotlib, das internnumpy für die Behandlung von Arrays verwendet wird. Wennnumpy wir tiefer durch die Codebasis nach graben , 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;
}

Dabei löst die Entpackungsmethode einen Fehler aus, wenn die Größe des Index größer als die der Ergebnisse ist.

Im Gegensatz zu Python, das ein TypeErrorbei falschen Indizes auslöst, löst Numpy das aus, IndexErrorweil es mehrdimensionale Arrays unterstützt.

mu 無
quelle