Digamos que tengo esta matriz:
array = np.array([[1,2,3],[4,5,6],[7,8,9]])
Devoluciones:
123 456 789
¿Cómo debo hacer para que devuelva algo como esto?
111222333 111222333 111222333 444555666 444555666 444555666 777888999 777888999 777888999
Tendrías que usar np.repeat
dos veces aquí.
np.repeat(np.repeat(array, 3, axis=1), 3, axis=0) # [[1 1 1 2 2 2 3 3 3] # [1 1 1 2 2 2 3 3 3] # [1 1 1 2 2 2 3 3 3] # [4 4 4 5 5 5 6 6 6] # [4 4 4 5 5 5 6 6 6] # [4 4 4 5 5 5 6 6 6] # [7 7 7 8 8 8 9 9 9] # [7 7 7 8 8 8 9 9 9] # [7 7 7 8 8 8 9 9 9]]
Por diversión (porque la reshape
anidada será más eficiente), puede usar einsum
en la matriz de entrada y una matriz ones
tenga dimensiones adicionales para crear una matriz multidimensional con las dimensiones en un orden ideal para reshape
a la forma 2D esperada:
np.einsum('ij,ikjl->ikjl', array, np.ones((3,3,3,3))).reshape(9,9)
Siendo el método genérico:
i,j = array.shape k = 3 # extra rows l = 3 # extra cols np.einsum('ij,ikjl->ikjl', a, np.ones((i,k,j,l))).reshape(i*k,j*l)
Producción:
array([[1, 1, 1, 2, 2, 2, 3, 3, 3], [1, 1, 1, 2, 2, 2, 3, 3, 3], [1, 1, 1, 2, 2, 2, 3, 3, 3], [4, 4, 4, 5, 5, 5, 6, 6, 6], [4, 4, 4, 5, 5, 5, 6, 6, 6], [4, 4, 4, 5, 5, 5, 6, 6, 6], [7, 7, 7, 8, 8, 8, 9, 9, 9], [7, 7, 7, 8, 8, 8, 9, 9, 9], [7, 7, 7, 8, 8, 8, 9, 9, 9]])
Sin embargo, lo bueno de este método es que es bastante fácil cambiar el orden para obtener otros patrones o trabajar con dimensiones más altas.
Ejemplo con otros patrones:
>>> np.einsum('ij,iklj->iklj', a, np.ones((3,3,3,3))).reshape(9,9) array([[1, 2, 3, 1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3, 1, 2, 3], [4, 5, 6, 4, 5, 6, 4, 5, 6], [4, 5, 6, 4, 5, 6, 4, 5, 6], [4, 5, 6, 4, 5, 6, 4, 5, 6], [7, 8, 9, 7, 8, 9, 7, 8, 9], [7, 8, 9, 7, 8, 9, 7, 8, 9], [7, 8, 9, 7, 8, 9, 7, 8, 9]]) >>> np.einsum('ij,kjil->kjil', a, np.ones((3,3,3,3))).reshape(9,9) array([[1, 1, 1, 4, 4, 4, 7, 7, 7], [2, 2, 2, 5, 5, 5, 8, 8, 8], [3, 3, 3, 6, 6, 6, 9, 9, 9], [1, 1, 1, 4, 4, 4, 7, 7, 7], [2, 2, 2, 5, 5, 5, 8, 8, 8], [3, 3, 3, 6, 6, 6, 9, 9, 9], [1, 1, 1, 4, 4, 4, 7, 7, 7], [2, 2, 2, 5, 5, 5, 8, 8, 8], [3, 3, 3, 6, 6, 6, 9, 9, 9]])