promedio - transpuesta de una matriz en python numpy
Cambiar el tamaƱo y estirar una matriz NumPy (3)
Estoy trabajando en Python y tengo una matriz NumPy como esta:
[1,5,9]
[2,7,3]
[8,4,6]
¿Cómo lo extiendo a algo como lo siguiente?
[1,1,5,5,9,9]
[1,1,5,5,9,9]
[2,2,7,7,3,3]
[2,2,7,7,3,3]
[8,8,4,4,6,6]
[8,8,4,4,6,6]
Estos son solo algunos ejemplos de arreglos, de hecho, cambiaré el tamaño de varios tamaños de arreglos, no solo estos.
Soy nuevo en esto, y parece que no puedo entender lo que necesito hacer.
Desafortunadamente, numpy no permite pasos fraccionarios (que yo sepa). Aquí hay una solución. No es tan inteligente como la solución de Kenny, pero utiliza la indexación tradicional:
>>> a = numpy.array([[1,5,9],[2,7,3],[8,4,6]])
>>> step = .5
>>> xstop, ystop = a.shape
>>> x = numpy.arange(0,xstop,step).astype(int)
>>> y = numpy.arange(0,ystop,step).astype(int)
>>> mg = numpy.meshgrid(x,y)
>>> b = a[mg].T
>>> b
array([[1, 1, 5, 5, 9, 9],
[1, 1, 5, 5, 9, 9],
[2, 2, 7, 7, 3, 3],
[2, 2, 7, 7, 3, 3],
[8, 8, 4, 4, 6, 6],
[8, 8, 4, 4, 6, 6]])
(La solución de dtlussier es mejor)
La respuesta de @KennyTM es muy ingeniosa, y realmente funciona para su caso, pero como una alternativa que podría ofrecer un poco más de flexibilidad para expandir matrices, intente np.repeat
:
>>> a = np.array([[1, 5, 9],
[2, 7, 3],
[8, 4, 6]])
>>> np.repeat(a,2, axis=1)
array([[1, 1, 5, 5, 9, 9],
[2, 2, 7, 7, 3, 3],
[8, 8, 4, 4, 6, 6]])
Por lo tanto, esto se repite a lo largo de un eje, para hacerlo a lo largo de múltiples ejes (como desee), simplemente anide las llamadas np.repeat
:
>>> np.repeat(np.repeat(a,2, axis=0), 2, axis=1)
array([[1, 1, 5, 5, 9, 9],
[1, 1, 5, 5, 9, 9],
[2, 2, 7, 7, 3, 3],
[2, 2, 7, 7, 3, 3],
[8, 8, 4, 4, 6, 6],
[8, 8, 4, 4, 6, 6]])
También puede variar el número de repeticiones para cualquier fila o columna inicial. Por ejemplo, si desea dos repeticiones de cada fila aparte de la última fila:
>>> np.repeat(a, [2,2,1], axis=0)
array([[1, 5, 9],
[1, 5, 9],
[2, 7, 3],
[2, 7, 3],
[8, 4, 6]])
Aquí, cuando el segundo argumento es una list
, especifica una fila (las filas en este caso porque el axis=0
) se repite para cada fila.
>>> a = numpy.array([[1,5,9],[2,7,3],[8,4,6]])
>>> numpy.kron(a, [[1,1],[1,1]])
array([[1, 1, 5, 5, 9, 9],
[1, 1, 5, 5, 9, 9],
[2, 2, 7, 7, 3, 3],
[2, 2, 7, 7, 3, 3],
[8, 8, 4, 4, 6, 6],
[8, 8, 4, 4, 6, 6]])