2013-06-04 13 views
6

Spesso quando lavoro con Numpy trovo fastidiosa la distinzione - quando estraggo un vettore o una riga da una matrice e poi eseguo operazioni con np.array s di solito ci sono problemi.numpy np.array rispetto a np.matrix (prestazioni)

per ridurre il mal di testa, ho preso a volte solo usando np.matrix (conversione di tutti i np.arrays a np.matrix) solo per semplicità. tuttavia, sospetto ci siano alcune implicazioni sulla performance. Qualcuno potrebbe commentare ciò che potrebbero essere e le ragioni per cui?

sembra che siano entrambi solo array sotto il cofano che l'accesso agli elementi è semplicemente un calcolo di offset per ottenere il valore, quindi non sono sicuro senza leggere l'intera fonte quale potrebbe essere la differenza.

più specificamente, quali implicazioni prestazioni ha questo:

v = np.matrix([1, 2, 3, 4]) 
# versus the below 
w = np.array([1, 2, 3, 4]) 

grazie

+1

Duplicato di [http://stackoverflow.com/questions/4151128/what-are-the-differences-between-numpy-arrays-and-matrices-which-one-should-iu](http://stackoverflow .com/questions/4151128/what-are-the-differences-between-numpy-arrays-and-matrici-which-one-i-iu) – jozzas

+1

sì, ma la mia domanda riguarda le prestazioni, che non è menzionata in quel post . Modificherò la mia domanda per rendere quella messa a fuoco più chiara. – lollercoaster

+2

Dubito che ci siano implicazioni significative sulle prestazioni, ma è piuttosto difficile da dire senza sapere esattamente cosa si sta pianificando per * fare * con l'oggetto una volta creato. Perché non eseguire alcune funzioni di test e dare una "prova del tempo"? – mgilson

risposta

3

ho aggiunto qualche altro test, e sembra che un array è notevolmente più veloce di matrix quando le matrici/matrici sono piccole, ma la differenza si riduce per strutture di dati più grandi:

Piccolo:

In [11]: a = [[1,2,3,4],[5,6,7,8]] 

In [12]: aa = np.array(a) 

In [13]: ma = np.matrix(a) 

In [14]: %timeit aa.sum() 
1000000 loops, best of 3: 1.77 us per loop 

In [15]: %timeit ma.sum() 
100000 loops, best of 3: 15.1 us per loop 

In [16]: %timeit np.dot(aa, aa.T) 
1000000 loops, best of 3: 1.72 us per loop 

In [17]: %timeit ma * ma.T 
100000 loops, best of 3: 7.46 us per loop 

ingrandita:

In [19]: aa = np.arange(10000).reshape(100,100) 

In [20]: ma = np.matrix(aa) 

In [21]: %timeit aa.sum() 
100000 loops, best of 3: 9.18 us per loop 

In [22]: %timeit ma.sum() 
10000 loops, best of 3: 22.9 us per loop 

In [23]: %timeit np.dot(aa, aa.T) 
1000 loops, best of 3: 1.26 ms per loop 

In [24]: %timeit ma * ma.T 
1000 loops, best of 3: 1.24 ms per loop 

Si noti che le matrici sono in realtà leggermente più veloce per la moltiplicazione.

Credo che quello che sto ottenendo qui sia coerente con ciò che @Jaime sta spiegando il commento.

5

C'è una discussione generale sulla SciPy.org e this question.

Per confrontare le prestazioni, ho fatto quanto segue in iPython. Si scopre che gli array sono significativamente più veloci.

In [1]: import numpy as np 
In [2]: %%timeit 
    ...: v = np.matrix([1, 2, 3, 4]) 
100000 loops, best of 3: 16.9 us per loop 

In [3]: %%timeit 
    ...: w = np.array([1, 2, 3, 4]) 
100000 loops, best of 3: 7.54 us per loop 

Pertanto gli array di numpy sembrano avere prestazioni più veloci rispetto alle matrici numpy.

Versioni utilizzati:

NumPy: 1.7.1

IPython: 0.13.2

Python: 2.7

Problemi correlati