¿Cómo hacer un bucle a través de una matriz numpy 2D utilizando las coordenadas x e y sin salir del error fuera de límites?

He probado lo siguiente:

import numpy as np a = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) print a rows = a.shape[0] cols = a.shape[1] print rows print cols for x in range(0, cols - 1): for y in range(0, rows -1): print a[x,y] 

Esto solo imprimirá los números 1 – 6.

También he intentado solo restar 1 de filas o columnas en el rango, pero eso lleva a un error fuera de límites o no a todos los números impresos.

a.shape[0] es el número de filas y el tamaño de la primera dimensión, mientras que a.shape[1] es el tamaño de la segunda dimensión. Necesitas escribir:

 for x in range(0, rows): for y in range(0, cols): print a[x,y] 

Observe cómo las filas y las columnas se han intercambiado en la función range() .

Edición: tiene que ser así porque una matriz puede ser rectangular (es decir, filas! = Cols). a.shape es el tamaño de cada dimensión en el orden en que se indexan. Por lo tanto, si la shape es (10, 5) cuando escribes:

 a[x, y] 

el máximo de x es 9 y el máximo para y es 4. y son en realidad nombres pobres para los índices de matriz, porque no representan un sistema de coordenadas de cartesis matemático, sino una ubicación en la memoria. Puedes usar i y j en su lugar:

 for i in range(0, rows): for j in range(0, cols): print a[i,j] 

La documentación es un poco larga, pero tiene una buena descripción detallada de los índices y las formas.

Obtienes un código más bonito con:

 for ix,iy in np.ndindex(a.shape): print(a[ix,iy]) 

Resultando en:

 1 2 3 4 5 6 7 8 9 10 11 12 

Puedes usar xrange .

 for x in xrange(rows): for y in xrange(cols): print a[x,y]