2012-01-29 24 views
17

que tengo:forma correcta y eficiente de aplanar matriz en numpy en python?

a = array([[1,2,3],[4,5,6]]) 

y me gustaría para aplanarlo, que une las dos listas internas en una entrada de la matriz plana. Puedo hacer:

array(list(flatten(a))) 

pero que parece ineficiente debido al yeso lista (Quiero terminar con una matriz y no un generador.)

Además, ¿cómo se puede generalizar a una matriz como esto:

b = array([[[1,2,3],[4,5,6]], [[10,11,12],[13,14,15]]]) 

donde el resultado debería ser:

b = array([[1,2,3,4,5,6], 
      [10,11,12,13,14,15]]) 

están ahí orden interna/numpy eficiente/sc ipy operadores para esto? Gracias.

Respuesta

11

Puede usar el reshape method.

>>> import numpy 
>>> b = numpy.array([[[1,2,3],[4,5,6]], [[10,11,12],[13,14,15]]]) 
>>> b.reshape([2, 6]) 
array([[ 1, 2, 3, 4, 5, 6], 
     [10, 11, 12, 13, 14, 15]]) 
+0

creo que debería ser 'a.reshape ([2,6])', gracias! – user248237dfsf

+0

@ user248237: uh, lo siento, leí mal su pregunta, pero ese es el método que debe usar. Corregido ahora. :) –

+4

remodelar() es un buen método. –

8

¿Qué tal:

>>> import numpy as np 
>>> a=np.arange(1,7).reshape((2,3)) 
>>> a 
array([[1, 2, 3], 
     [4, 5, 6]]) 
>>> a.flatten() 
array([1, 2, 3, 4, 5, 6]) 

y

>>> import numpy as np 
>>> b=np.arange(1,13).reshape((2,2,3)) 
>>> b 
array([[[ 1, 2, 3], 
     [ 4, 5, 6]], 

     [[ 7, 8, 9], 
     [10, 11, 12]]]) 
>>> b.reshape((2,6)) 
array([[ 1, 2, 3, 4, 5, 6], 
     [ 7, 8, 9, 10, 11, 12]]) 
+0

+1 para aplanar() - también puede hacer Fortran/aplanamiento de columna principal. la remodelación (-1) también se aplanará. –

15

Es posible que necesite de revisar numpy.flatten y numpy.ravel, ambos devuelven una matriz 1-d de una matriz n-d.

Además, si no va a modificar la matriz 1-d devuelta, le sugiero que use numpy.ravel, ya que no hace una copia de la matriz, sino que solo devuelve una vista de la matriz, que es mucho más rápido que numpy.flatten.

>>>a = np.arange(10000).reshape((100,100)) 

>>>%timeit a.flatten() 
100000 loops, best of 3: 4.02 µs per loop 

>>>%timeit a.ravel() 
1000000 loops, best of 3: 412 ns per loop 

También vea este post.

-1
a = np.arange(10000) 

%timeit a.reshape(100,100) 
1000000 loops, best of 3: 517 ns per loop 

%timeit a.resize(100,100) 
1000000 loops, best of 3: 428 ns per loop 

Me pregunto reshape debería tomar mucho menos tiempo pero su casi similar

Cuestiones relacionadas