HOWTO · Python

Corregir IndexError: índice no válido para una variable escalar

Diagnostique IndexError de NumPy cuando un valor escalar se indexa de nuevo.

En esta página

IndexError: invalid index to scalar variable significa que una operación de indexación ya produjo un valor escalar y que el siguiente [...] intenta volver a indexarlo. En NumPy, inspecciona ndim, shape de la matriz y el valor seleccionado antes de añadir otro índice.

Inspeccionar la matriz y el valor seleccionado

Una matriz unidimensional de NumPy necesita una posición para seleccionar un elemento. values[0] es un escalar de NumPy, no una matriz de un elemento; por eso, values[0][1] falla aunque values tenga varios elementos. Comprobar el tipo del valor seleccionado permite ver el problema. Este ejemplo autónomo muestra las dimensiones de la matriz y el valor seleccionado.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

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

La clase exacta del escalar puede variar según la compilación de NumPy y el tipo de datos; lo importante es que a selected ya no le quedan dimensiones de matriz que se puedan indexar. Usa índices en values solo hasta donde lo permitan sus dimensiones.

Reproducir el error y corregir una matriz unidimensional

Este ejemplo captura el diagnóstico para que el resto del programa pueda continuar. El primer subíndice selecciona el entero 1, así que el segundo no es válido. Si necesitas el elemento, quita el subíndice adicional; si necesitas otra matriz, aplica un corte a la matriz original. El bloque de salida no incluye una etiqueta «Output:»: muestra el mensaje de error y, a continuación, los valores 1 y [1 2].

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

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] devuelve un escalar. En cambio, values[0:2] usa un corte y devuelve una matriz unidimensional, que puedes volver a indexar si realmente hace falta. No intentes corregir este error añadiendo corchetes sin más: determina si el programa necesita un valor o una matriz más pequeña.

Indexar una matriz bidimensional de NumPy

Una matriz bidimensional tiene filas y columnas, por lo que dos índices son válidos mientras se apliquen a la matriz original. Es preferible la forma de tupla grid[row, column]: deja clara la operación bidimensional y evita confundir visualmente una cadena de selecciones escalares con un índice multidimensional.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

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

Ambas formas de indexación devuelven 6, pero grid[1, 2] expresa directamente la búsqueda por fila y columna. Un tercer índice, como grid[1, 2][0], intenta indexar el escalar 6 y produce este diagnóstico.

Distinguir la indexación de un escalar de un error de índice fuera de límites

Este mensaje es distinto de un error de índice fuera de límites. values[9] solicita un elemento que no existe e indica que el índice 9 está fuera de límites. En cambio, values[0][1] primero accede a un elemento válido y luego trata por error ese escalar como si fuera un contenedor.

Al depurar, imprime array.ndim y array.shape, y divide las expresiones largas en variables intermedias. Comprueba el tipo o shape después de cada selección. Así también puedes detectar una causa frecuente del error: que el código espere un resultado bidimensional, pero reciba una fila, una columna o un único escalar agregado.

Para consultar las reglas de indexación, visita la documentación de indexación de NumPy y la referencia de tipos escalares de NumPy. Estos ejemplos usan NumPy; las listas comunes de Python pueden producir mensajes distintos, así que inspecciona el objeto concreto antes de aplicar la solución.