2016-04-08 14 views
0

I zwei numpy Arrays von Form (1, 250000):seltsame Verhalten, wenn Quadrierung Elemente in numpy Array

a = [[ 0 254 1 ..., 255 0 1]] 
b = [[ 1 0 252 ..., 0 255 255]] 

ich eine neue numpy Array, dessen Elemente die Quadratwurzel der Summe von Quadraten erstellen möchten die Elemente in der Arrays a und b, aber ich bin nicht das richtige Ergebnis bekommen:

>>> c = np.sqrt(np.square(a)+np.square(b)) 
>>> print c 
[[ 1.   2.   4.12310553 ..., 1.   1.   1.41421354]] 

bin ich etwas einfaches hier fehle?

+1

Ihr Beispiel funktioniert eigentlich gut für mich. 'Import numpy als np' ' a = [[0, 254, 1, 255, 0, 1]] '' b = [[1, 0, 252, 0, 255, 255]] ' 'c = np.sqrt (np.square (a) + np.square (b))' Ausgabe: '[[1. 254. 252.00198412 255. 255. 255.00196078]]' Die zusätzlichen eckigen Klammern werden nicht benötigt, aber ich ließ sie an Ort und Stelle, um Ihre Code-Läufe zu zeigen, zumindest mit einem kurzen Beispiel. – roadrunner66

+2

Bitte geben Sie immer ein ausführbares Beispiel an, wenn Sie können (siehe [MCVE]), damit die Leute Ihr Problem sofort ausführen können. – roadrunner66

+0

Vielen Dank für das Feedback! –

Antwort

5

Vermutlich sind Ihre Arrays a und b Arrays von vorzeichenlosen 8-Bit-Ganzzahlen - Sie können dies überprüfen, indem Sie das Attribut a.dtype überprüfen. Wenn man sie quadrieren, wird der Datentyp erhalten, und die 8-Bit-Werte Überlauf, was bedeutet, dass die Werte „Wrap-around“ (dh die quadrierten Werte sind Modulo 256):

In [7]: a = np.array([[0, 254, 1, 255, 0, 1]], dtype=np.uint8) 

In [8]: np.square(a) 
Out[8]: array([[0, 4, 1, 1, 0, 1]], dtype=uint8) 

In [9]: b = np.array([[1, 0, 252, 0, 255, 255]], dtype=np.uint8) 

In [10]: np.square(a) + np.square(b) 
Out[10]: array([[ 1, 4, 17, 1, 1, 2]], dtype=uint8) 

In [11]: np.sqrt(np.square(a) + np.square(b)) 
Out[11]: 
array([[ 1.  , 2.  , 4.12310553, 1.  , 1.  , 
     1.41421354]], dtype=float32) 

Um das Problem zu vermeiden, können Sie sagen np.square einen Gleitkomma-Datentyp zu verwenden:

In [15]: np.sqrt(np.square(a, dtype=np.float64) + np.square(b, dtype=np.float64)) 
Out[15]: 
array([[ 1.  , 254.  , 252.00198412, 255.  , 
     255.  , 255.00196078]]) 

Sie auch die Funktion numpy.hypot verwenden könnte, aber möchten Sie vielleicht noch das dtype Argument verwenden, da sonst der Standard-Datentyp ist np.float16:

In [16]: np.hypot(a, b) 
Out[16]: array([[ 1., 254., 252., 255., 255., 255.]], dtype=float16) 

In [17]: np.hypot(a, b, dtype=np.float64) 
Out[17]: 
array([[ 1.  , 254.  , 252.00198412, 255.  , 
     255.  , 255.00196078]]) 

Sie fragen sich vielleicht, warum das dtype Argument, das ich in numpy.square verwendet und numpy.hypot nicht in den Docstrings Funktionen gezeigt. Beide Funktionen sind numpy "ufuncs", und die Autoren von numpy entschieden, dass es besser war, nur die Hauptargumente im Docstring zu zeigen. Die optionalen Argumente sind documented in the reference manual.

+0

Das hat funktioniert! Danke für die ausführliche Erklärung! Würde die Verwendung von numpy.hypot als "pythonischer" angesehen werden, als ich es gerade mache? –

0

Für diesen einfachen Fall funktioniert es völlig in Ordnung:

In [1]: a = np.array([[ 0, 2, 4, 6, 8]]) 
In [2]: b = np.array([[ 1, 3, 5, 7, 9]]) 
In [3]: c = np.sqrt(np.square(a) + np.square(b)) 

In [4]: print(c) 
[[ 1.  3.60555128 6.40312424 9.21954446 12.04159458]] 

Sie etwas falsch zu machen sein.