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 typenumpy.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 uints da firmare?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top