Comment puis-je forcer la soustraction à signer en Python?
-
20-09-2019 - |
Question
Vous pouvez passer à la ligne de fond si vous ne se soucient pas de l'arrière-plan:
Je le code suivant en Python:
ratio = (point.threshold - self.points[0].value) / (self.points[1].value - self.points[0].value)
Ce qui me donne de mauvaises valeurs. Par exemple, pour:
threshold: 25.0
self.points[0].value: 46
self.points[1].value: 21
Je suis:
ratio: -0.000320556853048
Ce qui ne va pas.
En regardant dans, j'ai réalisé que self.points[0].value
et self.points[1].value] are of the type
numpy.uint16`, alors je suis:
21 - 46 = 65511
Alors que je ne défini un type pour point.threshold
. Je viens de lui assignait. J'imagine qu'il a un int
vanilles.
The Bottom Line
Comment puis-je forcer la soustraction de deux uint
s à signer?
La solution
Presque tout mais uints travailleront ici, donc juste jeter ces à autre chose avant de faire la soustraction.
Depuis seuil = 25,0 (notez le point décimal), il est un flotteur, de sorte que la soustraction et division tous les travaux aussi longtemps que vous ne l'utilisez uints.
Autres conseils
Eh bien, la solution évidente serait probablement de jeter aux flotteurs:
ratio = (float(point.threshold) - float(self.points[0].value)) / (float(self.points[1].value) - float(self.points[0].value))
Ou je suppose que vous pourriez jeter à l'un des types numpy signé.
Est-ce que ces valeurs doivent effectivement être Uint16 au lieu de int16? À moins qu'ils doivent être en mesure de prendre des valeurs de 2**15
ou au-dessus (mais encore en dessous 2**16
) vous pouvez simplement les garder comme int16 et faire avec elle - ints non signés, comme vous avez découvert, peut être difficile (et pas seulement dans numpy; -). Si vous avez besoin du uint16, alors que David jette suggère fonctionnera, mais si vous pouvez simplement utiliser Int16 il sera plus rapide et plus facile à lire.
BTW, il ressemble à ce que point.threshold est un flotteur, pas un int (bonne chose, sinon que la division de la façon dont vous le code que ce serait un tronquer un, à moins que vous importez vrai division de l'avenir, a été pris en charge dans de nombreux communiqués de 2.*
de Python - et est enfin la division façon fonctionne en 3.*
). Le .0
en 25.0
« donne de suite » et montre qu'il est un flotteur, pas int.