2015-03-31 3 views
11

Gibt es einen Unterschied zwischen numpy.square und den Operator ** auf einem Numpy-Array?Python numpy.square vs **

Von dem was ich sehe, ergibt es das gleiche Ergebnis.

Unterschiede in der Effizienz der Ausführung?

Ein Beispiel zur Verdeutlichung:

In [1]: import numpy as np 

In [2]: A = np.array([[2, 2],[2, 2]]) 

In [3]: np.square(A) 
Out[3]: 
array([[4, 4], 
     [4, 4]]) 

In [4]: A ** 2 
Out[4]: 
array([[4, 4], 
     [4, 4]]) 
+0

Verwenden 'timeit' zu überprüfen, welche ist schneller, wenn dies ist, was Sie nach. – Marcin

+3

Sie sind nicht ganz gleich, 'np.square()' tut eine elementweise Quadrierung, während einige Klassen z. matrix Der Operator '__pow __()' macht etwas anderes. Für die Array-Klasse sind sie gleich. Ändern Sie "Array" in "Matrix" und sehen Sie den Unterschied. – AChampion

+0

Außerdem kann x ** 2 (wobei x ein numpy Array ist) Ihnen einige negative Elemente geben, während np.square (x) nicht – BlackBear

Antwort

9

Sie können die Ausführungszeit überprüfen, um klares Bild davon

In [2]: import numpy as np 
In [3]: A = np.array([[2, 2],[2, 2]]) 
In [7]: %timeit np.square(A) 
1000000 loops, best of 3: 923 ns per loop 
In [8]: %timeit A ** 2 
1000000 loops, best of 3: 668 ns per loop 
+3

Hinweis:% Zeit ist Ipython Magie. – AChampion

+1

np.square könnte bei größeren Matrizen auch schneller sein: 'sq = np.square % timeit sq (A)' -> '680ns' –

7

Für die meisten Geräte, die beide erhalten Sie die gleichen Ergebnisse liefern. Im Allgemeinen ist die Standard-Pythonie a * a oder a ** 2 schneller als die numpy.square() oder numpy.pow(), aber die numpigen Funktionen sind oft flexibler und präziser. Wenn Sie Berechnungen durchführen, die sehr genau sein müssen, bleiben Sie bei numpy und verwenden Sie wahrscheinlich sogar andere Datentypen (float96).

Für den normalen Gebrauch wird ein ** 2 eine gute Arbeit und viel schneller Job als numpy. Die Jungs in this thread gaben einige gute Beispiele zu ähnlichen Fragen.

+1

'**' eines numpy Arrays ist nur syntaktischer Zucker für ndarray .__ pow __() . – AChampion

+0

richtig, ich war ziemlich unklar über die Art des Arguments (numpy oder nicht) – foehnx