Numpy matrix a array


149

Estoy usando numpy. Tengo una matriz con 1 columna y N filas y quiero obtener una matriz con N elementos.

Por ejemplo, si tengo M = matrix([[1], [2], [3], [4]]), quiero obtener A = array([1,2,3,4]).

Para lograrlo, lo uso A = np.array(M.T)[0]. ¿Alguien sabe una forma más elegante de obtener el mismo resultado?

¡Gracias!


Respuestas:


192

Si desea algo un poco más legible, puede hacer esto:

A = np.squeeze(np.asarray(M))

De manera equivalente, también podría hacer: A = np.asarray(M).reshape(-1)pero eso es un poco menos fácil de leer.


9
Poco despotricar de mi parte ... ¿por qué numpy tiene matrices y matrices como entidades separadas? Es tan poco propicio en mi humilde opinión. Gracias por este consejo @ Joe.
Naijaba

66
@Naijaba: por lo que vale, la clase de matriz se deprecia de manera efectiva (pero no formal). Está allí principalmente para fines históricos. La eliminación numpy.matrixes un tema un tanto polémico, pero los desarrolladores entusiastas están muy de acuerdo con usted en que tener ambas cosas es poco propicio y molesto por muchas razones. Sin embargo, la cantidad de código antiguo y sin mantenimiento "en la naturaleza" que utiliza matrixhace que sea difícil eliminarlo por completo.
Joe Kington

1
Sin mencionar que la verdadera multiplicación de matrices solo se agregó para matrices en Numpy 1.10, y básicamente todavía está en beta. Esto significa que mucha gente (incluido yo mismo) todavía tiene que usar matrices en lugar de matrices para hacer lo que queremos hacer. docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html
Georges Oates Larsen

1
Las matrices dispersas son fundamentales para el aprendizaje automático con uso eficiente de la memoria (por ejemplo, sklearn). De hecho, hay diferentes sparse matrixtipos scipy, que permiten un acceso eficiente a través de filas o columnas. Me imagino que esto puede ser un problema para fusionar los conceptos de matriz y matriz. Dicho esto, me pregunto si también podría introducirse un sparse arraytipo y si hay algún plan para hacerlo. ¿Alguna pista?
pms

Creo que .flatten () funciona tan bien como .squeeze (), siempre que desee una matriz 1D al final.
wordsforthewise

122

66
Creo que esta respuesta es mejor que la respuesta aceptada, en cuanto a rendimiento y simplicidad
dariush

M.A1 es excelente, la misma implementación que "ravel" y "flatten" y en este caso no causa ninguna copia de datos A, por lo tanto, permanece vinculada a M, lo que puede causar sorpresas si A y / o M son mutables. El generador "flatiter" que devuelve la alternativa genuina M.flat (semántica de solo lectura) np.squeeze (M) # ofrece una vista que elimina las dimensiones de tamaño 1, aquí también, pero no se garantiza que sea 1-d para M np.reshape general ( M, -1) # es normalmente una vista dependiendo de la compatibilidad forma, este "-1" es una manera indirecta de hacer A1 / enmarañamiento / Aplanar
jayprich

13
A, = np.array(M.T)

depende de lo que quieras decir con elegancia, supongo, pero eso es lo que haría


11

Puedes probar la siguiente variante:

result=np.array(M).flatten()

7
np.array(M).ravel()

Si te importa la velocidad; Pero si te importa la memoria:

np.asarray(M).ravel()


6

O podrías tratar de evitar algunas temperaturas con

A = M.view(np.ndarray)
A.shape = -1

2

Primero, Mv = numpy.asarray(M.T)que te da una matriz 4x1 pero 2D.

Luego, realiza A = Mv[0,:], lo que te da lo que quieres. Podrías ponerlos juntos, como numpy.asarray(M.T)[0,:].



0

Las funciones ravel () y flatten () de numpy son dos técnicas que probaría aquí. Me gustaría agregar a las publicaciones hechas por Joe , Siraj , bubble y Kevad .

Enmarañar:

A = M.ravel()
print A, A.shape
>>> [1 2 3 4] (4,)

Aplanar:

M = np.array([[1], [2], [3], [4]])
A = M.flatten()
print A, A.shape
>>> [1 2 3 4] (4,)

numpy.ravel()es más rápido , ya que es una función de nivel de biblioteca que no realiza ninguna copia de la matriz. Sin embargo, cualquier cambio en la matriz A se transferirá a la matriz original M si está utilizandonumpy.ravel() .

numpy.flatten()es más lento quenumpy.ravel() . Pero si usted está utilizando numpy.flatten()para crear A, entonces los cambios en A no dejarse llevar a la matriz original M .

numpy.squeeze()y M.reshape(-1)son más lentos que numpy.flatten()y numpy.ravel().

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

%timeit M.flatten()
>>> 1000000 loops, best of 3: 650 ns per loop

%timeit M.reshape(-1)
>>> 1000000 loops, best of 3: 755 ns per loop

%timeit np.squeeze(M)
>>> 1000000 loops, best of 3: 886 ns per loop
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.