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!
print data
nachherfor 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)print(data)
stattdessen sein.IndexError: index 12 is out of bounds for axis 1 with size 12
ist explizit, dass es irgendwo eine Datenzeile gibt, die nur 12 Elemente enthält.Antworten:
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
data
es 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 ArrayError
, sodass Sie es nie erfahren würden ...). Wenn Sie sich vor diesem Fehler schützen möchten, können Sie eine Fehlerprüfung in Ihreloadfile
Funktion einfügen .Ich empfehle dringend, in Ihre
for
Schleife einzufügen: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_l1
Liste (dh eine Datei) das Problem verursacht.quelle
Die Meldung, die Sie erhalten, gilt nicht für die Standardausnahme von Python:
Wird für eine neue Python-Liste
IndexError
nur 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
TypeError
bei falschen Indizes auslöst, löst Numpy das aus,IndexError
weil es mehrdimensionale Arrays unterstützt.quelle