2013-06-04 8 views
6

oft finde ich bei der arbeit mit numpy die unterscheidung nervig - wenn ich einen vektor oder eine zeile aus einer matrix ziehe und dann operationen mit np.array s mache gibt es meist probleme.numpy np.array versus np.matrix (performance)

um Kopfschmerzen zu reduzieren, habe ich manchmal nur mit np.matrix (Umwandlung aller np.arrays zu np.matrix) nur für die Einfachheit genommen. Ich vermute jedoch, dass es einige Auswirkungen auf die Leistung gibt. Könnte jemand kommentieren, was diese sein könnten und warum?

Es scheint, als wenn sie beide nur Arrays unter der Haube sind, dass Elementzugriff ist einfach eine Offset-Berechnung, um den Wert zu erhalten, so bin ich mir nicht sicher, ohne durch die gesamte Quelle zu lesen, was der Unterschied sein könnte.

genauer gesagt, was Auswirkungen auf die Leistung hat dies:

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

dank

+1

Duplikat von [http://stackoverflow.com/questions/4151128/what-are-the-differences-between-numpy-arrays-and-matrices-which-one-should-iu](http://stackoverflow .com/questions/4151128/what-sind-die-Unterschiede-zwischen-numpy-arrays-und-Matrizen-which-one-soll-iu) – jozzas

+1

ja, aber meine Frage bezieht sich auf Leistung, die in diesem Beitrag nicht erwähnt wird . Ich werde meine Frage bearbeiten, um diesen Fokus klarer zu machen. – lollercoaster

+2

Ich bezweifle, dass es signifikante Auswirkungen auf die Leistung gibt, aber es ist schwer zu sagen, ohne genau zu wissen, was Sie vorhaben * mit * dem Objekt zu tun, sobald Sie es erstellt haben. Warum nicht ein paar Testfunktionen machen und "Zeit" ausprobieren? – mgilson

Antwort

3

ich habe noch einige weitere Tests, und es scheint, dass eine array ist erheblich schneller als matrix, wenn Array/Matrizen klein sind, aber der Unterschied wird für größere Datenstrukturen kleiner:

Klein:

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 

Größere:

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 

Beachten Sie, dass Matrizen tatsächlich etwas schneller zur Multiplikation sind.

Ich glaube, dass das, was ich hier bekomme, konsistent mit dem ist, was @Jaime den Kommentar erklärt.

5

Es gibt eine allgemeine Diskussion über SciPy.org und auf this question ist.

Um die Leistung zu vergleichen, habe ich in iPython Folgendes getan. Es stellt sich heraus, dass Arrays wesentlich schneller sind.

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 

Daher scheint numpy Arrays schneller als numpy Matrizen zu haben.

verwendet Versionen:

Numpy: 1.7.1

IPython: 0.13.2

Python: 2.7