¿Una forma correcta y eficiente de aplanar la matriz en número en Python?

Yo tengo:

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

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

 array(list(flatten(a))) 

pero eso parece ineficiente debido a la lista de conversiones (quiero terminar con una matriz y no con un generador).

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

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

donde el resultado debe ser:

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

¿hay operadores incorporados / eficientes numpy / scipy para esto? Gracias.

Puedes usar el método de reshape .

 >>> 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]]) 

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

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 simplemente devuelve una vista de la matriz, que es mucho más rápida. 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 puedes ver esta publicación .

Qué tal si:

 >>> 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]]) 
 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 si la remodelación debería tomar mucho menos tiempo, pero es casi similar.