HOWTO · Python
IndexError: Ungültiger Index für eine skalare Variable beheben
Diagnostizieren und beheben Sie NumPys IndexError bei einem erneuten Indexzugriff auf einen Skalar.
Auf dieser Seite
IndexError: invalid index to scalar variable bedeutet, dass ein Indexzugriff bereits einen einzelnen Skalarwert geliefert hat und das nächste [...] versucht, diesen Skalar erneut zu indizieren. Prüfen Sie bei NumPy vor einem weiteren Indexzugriff das ndim und shape des Arrays sowie den ausgewählten Wert.
Array und ausgewählten Wert prüfen
Bei einem eindimensionalen NumPy-Array genügt eine Position, um ein Element auszuwählen. values[0] ist ein NumPy-Skalar und kein Array mit einem Element. Deshalb schlägt values[0][1] fehl, obwohl values selbst mehrere Elemente enthält. Eine Prüfung des Typs des ausgewählten Werts macht die Ursache sichtbar. Dieses eigenständige Beispiel zeigt die Dimensionen des Arrays und den daraus ausgewählten Wert. Der Codeblock und seine Beschriftungen sowie Ausgaben bleiben auf Englisch.
import numpy as np
values = np.array([1, 2, 3, 4, 5])
selected = values[0]
print(values.ndim, values.shape)
print(type(selected).__name__)
print(values[3])
1 (5,)
int64
4
Die genaue skalare Klasse kann je nach NumPy-Build und Datentyp variieren. Entscheidend ist, dass selected keine Array-Dimension mehr zum Indizieren besitzt. Indizieren Sie values nur so weit, wie es seine Dimensionen zulassen.
Fehler reproduzieren und ein eindimensionales Array korrigieren
Dieses Beispiel fängt die Diagnose ab, damit das Programm anschließend weiterlaufen kann. Der erste Index wählt die Ganzzahl 1 aus; der zweite Index ist daher ungültig. Lassen Sie den zusätzlichen Index weg, wenn Sie den Wert benötigen, oder verwenden Sie einen Slice des ursprünglichen Arrays, wenn Sie ein weiteres Array brauchen. Der Codeblock und seine Beschriftungen sowie Ausgaben bleiben auf Englisch.
import numpy as np
values = np.array([1, 2, 3, 4, 5])
try:
print(values[0][1])
except IndexError as error:
print(error)
print(values[0])
print(values[0:2])
invalid index to scalar variable.
1
[1 2]
values[0] gibt einen einzelnen Skalar zurück. values[0:2] verwendet dagegen einen Slice und liefert ein eindimensionales Array, das sich bei Bedarf erneut indizieren lässt. Fügen Sie nicht einfach weitere Klammern hinzu, um den Fehler zu beheben. Entscheiden Sie zuerst, ob der Code einen einzelnen Wert oder ein kleineres Array benötigt.
Ein zweidimensionales NumPy-Array indizieren
Ein zweidimensionales Array hat Zeilen und Spalten. Daher sind zwei Indizes gültig, solange sie sich auf das ursprüngliche Array beziehen. Verwenden Sie vorzugsweise die Tupelschreibweise grid[row, column]. So wird der zweidimensionale Zugriff deutlich, und er lässt sich optisch besser von einer Kette skalarer Auswahlvorgänge unterscheiden. Der Codeblock und seine Beschriftungen sowie Ausgaben bleiben auf Englisch.
import numpy as np
grid = np.array([[1, 2, 3], [4, 5, 6]])
print(grid.ndim, grid.shape)
print(grid[1, 2])
print(grid[1][2])
2 (2, 3)
6
6
Beide Indexierungsformen geben 6 zurück, aber grid[1, 2] drückt den beabsichtigten Zugriff auf Zeile und Spalte direkter aus. Ein dritter Index wie grid[1, 2][0] versucht, den Skalar 6 zu indizieren, und löst diese Diagnose aus.
Skalarzugriff von einem Index außerhalb des gültigen Bereichs unterscheiden
Diese Meldung unterscheidet sich von einem Fehler wegen eines Index außerhalb des gültigen Bereichs. values[9] fordert ein nicht vorhandenes Element an und meldet, dass der Index 9 außerhalb des gültigen Bereichs liegt. values[0][1] erreicht zunächst ein gültiges Element und behandelt diesen Skalar anschließend fälschlicherweise wie einen Container.
Geben Sie beim Debuggen array.ndim und array.shape aus und zerlegen Sie lange Ausdrücke in Zwischenschritte. Prüfen Sie nach jeder Auswahl den Typ oder shape. So erkennen Sie auch eine häufige Fehlerquelle: Der Code erwartet ein zweidimensionales Ergebnis, erhält aber stattdessen eine Zeile, eine Spalte oder einen aggregierten Skalar.
Die Indexierungsregeln finden Sie in der Indexierungsdokumentation zu NumPy und in der Referenz zu skalaren Typen von NumPy. Diese Beispiele verwenden NumPy. Bei gewöhnlichen Python-Listen können andere Fehlermeldungen auftreten. Prüfen Sie daher das tatsächliche Objekt, bevor Sie die Korrektur anwenden.