Wie kann ich Subtraktion zwingen, in Python unterzeichnet werden?
-
20-09-2019 - |
Frage
Sie können auf der unteren Zeile überspringen, wenn Sie nicht über den Hintergrund ist es egal:
Ich habe den folgenden Code in Python:
ratio = (point.threshold - self.points[0].value) / (self.points[1].value - self.points[0].value)
Was mir falsche Werte gibt. Zum Beispiel für:
threshold: 25.0
self.points[0].value: 46
self.points[1].value: 21
Ich habe:
ratio: -0.000320556853048
Welche falsch ist.
Ein Blick in sie, erkannte ich, dass self.points[0].value
und self.points[1].value] are of the type
numpy.uint16`, so habe ich:
21 - 46 = 65511
Während ich nie definiert einen Typ für point.threshold
. Ich kann es nur zugewiesen. Ich stelle mir einen Plain-Vanilla-int
bekam.
The Bottom Line
Wie kann ich die die Subtraktion zweier uint
s zwingen unterzeichnet werden?
Lösung
Fast alles und uints wird hier arbeiten, so werfen gerade diese auf etwas anderes, bevor Sie die Subtraktion tun.
Da threshold = 25,0 (der Dezimalpunkt beachten), dann ist es ein Schwimmer, so die Subtraktion und Division werden alle arbeiten, solange Sie nicht uints verwenden.
Andere Tipps
Nun, die offensichtliche Lösung wahrscheinlich zu cast Schwimmer sein würde:
ratio = (float(point.threshold) - float(self.points[0].value)) / (float(self.points[1].value) - float(self.points[0].value))
Oder ich nehme an, Sie zu einem der numpy unterzeichnete Typen stellen könnten.
Sie müssen diese Werte tatsächlich statt int16 sein uint16? Es sei denn, sie zu nehmen Werte von 2**15
in die Lage sein oder höher (aber immer noch unter 2**16
) konnte man sich einfach als int16 halten und mit ihm getan werden - unsigned ints, wie Sie entdecken kann schwierig sein (und nicht nur in numpy; -). Wenn Sie die uint16 brauchen, dann wirft wie David Willen Arbeit legt nahe, aber wenn man einfach int16 verwenden kann, wird es schneller und besser lesbar sein.
BTW, sieht es so aus, dass point.threshold ein Schwimmer ist, kein int (gut so, sonst die Teilung so, wie Sie Code es ein Verkürzen sein würde, es sei denn, Sie echte Division aus der Zukunft importieren, als und schließlich der Weg Abteilung arbeitet in 2.*
) - wurde in vielen 3.*
Versionen von Python unterstützt. Die .0
in 25.0
„gibt es weg“ und zeigt es ist ein Schwimmer, kein int.