2010-07-26 23 views
104

Sto usando numpy. Ho una matrice con 1 colonna e N righe e voglio ottenere una matrice con N elementi.Numpy matrix to array

Ad esempio, se ho M = matrix([[1], [2], [3], [4]]), voglio ottenere A = array([1,2,3,4]).

Per raggiungerlo, utilizzo A = np.array(M.T)[0]. Qualcuno sa un modo più elegante per ottenere lo stesso risultato?

Grazie!

+0

Ivnerse domanda: [convertire una matrice NumPy 2D a matrice 2D NumPy] (http://stackoverflow.com/questions/17443620/convert-a-2d -numpy-array-to-a-2d-numpy-matrix) –

risposta

125

Se vuoi qualcosa di un po 'più leggibile, si può fare questo:

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

modo equivalente, si potrebbe anche fare: A = np.asarray(M).reshape(-1), ma questo è un po' meno facile da leggere.

+4

Piccola battuta da parte mia ... perché numpy ha matrici e matrici come entità separate. È un IMHO così poco suggestivo. Grazie per questo suggerimento @Joe. – Naijaba

+5

@Naijaba - Per quello che vale, la classe matrice è efficace (ma non formalmente) ammortizzata. È lì principalmente per scopi storici. Rimozione di 'numpy.matrix' è un po 'un problema di contenzioso, ma gli sviluppatori di Numpy sono molto d'accordo con te sul fatto che avere entrambi è unponotico e fastidioso per tutta una serie di motivi. Tuttavia, la quantità di vecchio codice non mantenuto "in the wild" che utilizza 'matrix' rende difficile rimuoverlo completamente. –

+1

Per non parlare del fatto che la moltiplicazione della matrice vera è stata aggiunta solo per gli array di Numpy 1.10, ed è fondamentalmente ancora in beta. Ciò significa che molte persone (incluso me stesso) devono ancora utilizzare le matrici anziché gli array per ottenere ciò che vogliamo. https://docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html –

5

Oppure si potrebbe cercare di evitare alcuni temps con

A = M.view(np.ndarray) 
A.shape = -1 
10
A, = np.array(M.T) 

dipende cosa si intende per eleganza suppongo ma questo è quello che vorrei fare

4

si può provare la seguente variante:

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

Se vi preoccupate per la velocità; Ma se si cura per la memoria:

np.asarray(M).ravel() 
1

In primo luogo, Mv = numpy.asarray(M.T), che vi dà un 4x1, ma matrice 2D.

Quindi, eseguire A = Mv[0,:], che ti dà quello che vuoi. Potresti metterli insieme, come numpy.asarray(M.T)[0,:].

0

Questo convertirà la matrice nella matrice

A = np.ravel(M).T