GOOGLE ADS

domingo, 1 de mayo de 2022

¿Reformar en bloque en numpy?

Tengo una matriz numpy con columnas que están en bloques. Quiero transponer los bloques. Es conceptualmente simple, y supongo que uno puede hacerlo simplemente, pero no sé cómo.

Dada una matriz numpy en forma de bloque np.hstack(list_of_blocks), quiero obtener np.vstack(list_of_blocks).

Para hacerlo más preciso, quiero pasar de una matriz aa otra ben el fragmento a continuación.

import numpy as np
a = np.zeros((3,6))
b = np.zeros((9,2))
t_max = 3
for col in range(1,7):
for time in range(1,t_max+1):
val = ((1+col)//2)*100+((col+1) % 2)*10+time
a[time-1,col-1]= val
b[time+t_max*(((1+col)//2)-1)-1,((col+1) % 2)] = val

y las matrices se ven como:

>>> print(a)
[[101. 111. 201. 211. 301. 311.]
[102. 112. 202. 212. 302. 312.]
[103. 113. 203. 213. 303. 313.]]
>>> print(b)
[[101. 111.]
[102. 112.]
[103. 113.]
[201. 211.]
[202. 212.]
[203. 213.]
[301. 311.]
[302. 312.]
[303. 313.]]

Por supuesto que las matrices no son 3 x (2*3)sino más bienn x (k*m)

¿Cuál es una forma eficiente de remodelar así en números?


Solución del problema

Reformar, permutar hachas y reformar -

N = a.shape[1]//t_max
b_out = a.reshape(a.shape[0],-1,N).swapaxes(0,1).reshape(-1,N)

Más información sobre intuition behind nd-to-nd array transformation.

No hay comentarios.:

Publicar un comentario

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...