Come posso forzare la sottrazione da firmare in Python?
-
20-09-2019 - |
Domanda
È possibile saltare alla linea di fondo se non si cura di sfondo:
Ho il seguente codice in Python:
ratio = (point.threshold - self.points[0].value) / (self.points[1].value - self.points[0].value)
Il che mi sta dando valori errati. Per esempio, per:
threshold: 25.0
self.points[0].value: 46
self.points[1].value: 21
ho ottenuto:
ratio: -0.000320556853048
che è sbagliato.
In cerca in esso, ho capito che self.points[0].value
e self.points[1].value] are of the type
numpy.uint16`, così ho ottenuto:
21 - 46 = 65511
Mentre non ho mai definito un tipo per point.threshold
. Ho appena assegnato. Immagino che ottenuto un int
plain vanilla.
The Bottom Line
Come posso forzare la sottrazione di due uint
s da firmare?
Soluzione
Quasi tutto ma uints lavoreranno qui, quindi basta lanciare questi per qualcos'altro prima di fare la sottrazione.
Dal momento che la soglia = 25,0 (notare il punto decimale), è un galleggiante, per cui la sottrazione e divisione sarà tutto il lavoro fino a quando non si sta usando uints.
Altri suggerimenti
Bene, la soluzione più ovvia sarebbe probabilmente a gettare per i galleggianti:
ratio = (float(point.threshold) - float(self.points[0].value)) / (float(self.points[1].value) - float(self.points[0].value))
O suppongo che si possa lanciare a uno dei tipi NumPy firmato.
Do quei valori effettivamente bisogno di essere Uint16 invece di Int16? A meno che non devono essere in grado di prendere i valori di 2**15
o superiore (ma ancora al di sotto 2**16
) si potrebbe semplicemente tenerli come Int16 e da fare con esso - unsigned int, come hai scoperto, può essere difficile (e non solo in numpy; -). Se avete bisogno del UINT16, poi getta come David suggerisce lavoro sarà, ma se si può semplicemente utilizzare Int16 sarà più veloce e più leggibile.
A proposito, sembra che point.threshold è un galleggiante, non un int (buona cosa troppo, altrimenti quella divisione il modo in cui si codifica sarebbe una troncando uno, a meno che non si sta importando vera divisione dal futuro, come è stato sostenuto in molte versioni 2.*
di Python - ed è, infine, la divisione modo in cui funziona in 3.*
). Il .0
in 25.0
"dà via" e mostra che è un float, non un int.