Matrice numpy a matrice


150

Sto usando numpy. Ho una matrice con 1 colonna e N righe e desidero ottenere una matrice con N elementi.

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

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

Grazie!


Risposte:


192

Se desideri qualcosa di più leggibile, puoi farlo:

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

Allo stesso modo, potresti anche fare:, A = np.asarray(M).reshape(-1)ma è un po 'meno facile da leggere.


9
Poco rant da parte mia ... perché numpy ha array e matrici come entità separate. È un IMHO così poco sincero. Grazie per questo suggerimento @Joe.
Naijaba,

6
@Naijaba - Per quello che vale, la classe matrice è effettivamente (ma non formalmente) deprezzata. È lì principalmente per scopi storici. La rimozione numpy.matrixè un po 'un problema controverso, ma gli sviluppatori intorpiditi sono molto d'accordo con te sul fatto che avere entrambi sia non sensato e fastidioso per una serie di ragioni. Tuttavia, la quantità di codice vecchio, non mantenuto "in the wild" che utilizza matrixrende difficile rimuoverlo completamente.
Joe Kington,

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

1
Le matrici sparse sono fondamentali per l'apprendimento automatico efficiente della memoria (ad es sklearn.). In realtà ci sono diversi sparse matrixtipi in scipy, che consentono un accesso efficiente tramite righe o colonne. Immagino che questo possa essere un problema per fondere i concetti di matrice e matrice. Detto questo, mi chiedo se potrebbe essere introdotto anche un sparse arraytipo e se ci sono piani per farlo. Qualche indizio?
pms

Penso che .flatten () funzioni così come .squeeze (), purché alla fine desideri un array 1D.
parole per il

122

6
Penso che questa risposta sia migliore della risposta accettata, per quanto riguarda le prestazioni e la semplicità
dariush,

M.A1 è eccezionale, la stessa implementazione di "ravel" e "flatten" e in questo caso non causa alcuna copia dei dati A, quindi rimane legata a M che può causare sorprese se A e / o M sono mutabili. Il generatore "flatiter" di ritorno alternativo originale M.flat (semantica di sola lettura) np.squeeze (M) # offre una vista che rimuove le dimensioni della dimensione 1, ok anche qui ma non è garantito che sia 1-d per la M np.reshape generale ( M, -1) # è di solito una vista a seconda della compatibilità della forma, questo "-1" è un modo rotatorio per fare A1 / ravel /
flatten

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

dipende da cosa intendi per eleganza, suppongo, ma è quello che vorrei fare


11

Puoi provare la seguente variante:

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

7
np.array(M).ravel()

Se ti interessa la velocità; Ma se ti interessa la memoria:

np.asarray(M).ravel()

Migliorerebbe la qualità della tua risposta se spiegassi perché
Milo Wielondek,

6

Oppure potresti provare ad evitare alcune temp con

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

2

Innanzitutto, Mv = numpy.asarray(M.T)che ti offre un array 4x1 ma 2D.

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


2

Questo convertirà la matrice in matrice

A = np.ravel(M).T

0

Le funzioni ravel () e flatten () di numpy sono due tecniche che vorrei provare qui. Vorrei aggiungere ai post pubblicati da Joe , Siraj , bubble e Kevad .

Ravel:

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

Appiattire:

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

numpy.ravel()è più veloce , poiché è una funzione a livello di libreria che non esegue alcuna copia dell'array. Tuttavia, qualsiasi modifica dell'array A si riporterà sull'array M originale se si sta utilizzandonumpy.ravel() .

numpy.flatten()è più lento dinumpy.ravel() . Ma se si utilizza numpy.flatten()per creare A, le modifiche in A non verranno trasferite nell'array M originale .

numpy.squeeze()e M.reshape(-1)sono più lenti di numpy.flatten()e 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.