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.
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
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
Vielen Dank für das Feedback! –