¿Cómo traducir / cambiar una matriz numpy?

No estoy seguro de qué palabra clave buscar, por lo que si ya se ha solicitado, vincule la respuesta y cierre este hilo.

Estoy tratando de desplazar las entradas que no son cero de una matriz numpy en una dirección fija, por ejemplo, imagino que tengo una matriz 2D:

0 1 2 0 0 3 0 0 0 0 0 0 0 0 0 0 

Desplazándolo por (1,1) produciría la siguiente matriz:

 0 0 0 0 0 0 1 2 0 0 3 0 0 0 0 0 

Digamos que si las entradas que no son cero salen de su límite simplemente se eliminan. ¿Cómo podría hacer esto?

Edición: aparentemente algún duplicado de esto? Elementos de cambio en una matriz de números Realmente no veo por qué son la misma pregunta en absoluto porque se trata de hacer un bucle de las cosas, así que es más una acción “rodante” que un cambio. También me gustó la solución aquí, es muy simple y legible.

Editar de nuevo: arreglado algunos formatos.

Para administrar simplemente los bordes, puede ampliar su matriz en una más grande:

 square=\ array([[0, 2, 2, 0], [0, 2, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], dtype=int64) n,m=square.shape bigsquare=np.zeros((3*n,3*m),square.dtype) bigsquare[n:2*n,m:2*m]=square 

Entonces el cambio es solo una vista:

 def shift(dx,dy): x=n-dx y=m-dy return bigsquare[x:x+n,y:y+m] print(shift(1,1)) #[[0 0 0 0] # [0 0 2 2] # [0 0 2 0] # [0 0 0 0]]