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 777888999Tendrí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]])