2010-11-19 18 views
19

estoy trabajando en Python y tengo una matriz NumPy así:Cambio de tamaño y se extiende una matriz NumPy

[1,5,9] 
[2,7,3] 
[8,4,6] 

¿Cómo se estira 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] 

Estas son sólo algunas matrices ejemplo, que en realidad será el cambio de tamaño de las matrices de varios tamaños, no sólo estos.

Soy nuevo en esto, y parece que no puedo entender lo que tengo que hacer.

Respuesta

21

@ respuesta de KennyTM es muy pulido, y realmente funciona para su caso, pero como una alternativa que puede ofrecer un poco más de flexibilidad para la expansión de las matrices tratan 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 logra repitiendo a lo largo de un eje, para conseguir que a lo largo de múltiples ejes (como es posible que desee), sólo tiene que anidar 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]]) 

usted también puede variar el número de repeticiones fo r cualquier fila o columna inicial. Por ejemplo, si usted quiere 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 un list se especifica un modo de fila (filas en este caso porque axis=0) repite para cada fila .

+0

https: //docs.scipy. org/doc/numpy/reference/generated/numpy.repeat.html –

12
>>> 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]]) 
+2

En caso de que alguien se está preguntando, que es el producto de Kronecker: http: //docs.scipy. org/doc/numpy/reference/generated/numpy.kron.html – krawyoti

+0

tan genial como esta respuesta es, se tarda el doble de tiempo que el método de repetición en la respuesta de dtlussier en mi máquina para grandes matrices –

1

Desafortunadamente numpy no permite pasos fraccionarios (por lo que yo sé). Aquí hay una solución. No es tan inteligente como solución de Kenny, sino que hace uso de 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]]) 

(solución de dtlussier es mejor)

Cuestiones relacionadas