Pregunta

Puede saltar a la línea de fondo si no se preocupan por el fondo:

Tengo el siguiente código en Python:

ratio = (point.threshold - self.points[0].value) / (self.points[1].value - self.points[0].value)

Lo que me está dando valores erróneos. Por ejemplo, para:

threshold:  25.0
self.points[0].value:  46
self.points[1].value:  21

Tengo:

ratio:  -0.000320556853048

¿Qué es un error.

Mirando hacia él, me di cuenta que self.points[0].value y self.points[1].value] are of the typenumpy.uint16`, así que me dieron:

21 - 46 = 65511

Aunque nunca se ha definido un tipo de point.threshold. Me acaba de asignar la misma. Me imagino que tiene un int con sabor de vainilla.

La línea de base

¿Cómo puedo forzar la sustracción de dos uints a ser firmado?

¿Fue útil?

Solución

Casi cualquier cosa pero uints trabajarán aquí, por lo que sólo fundido éstos a otra cosa antes de hacer la resta.

Desde umbral = 25,0 (tenga en cuenta el punto decimal), es un flotador, por lo que la resta y la división hará todo el trabajo, siempre y cuando no se esté usando uints.

Otros consejos

Bueno, la solución obvia sería, probablemente, para echar a los flotadores:

ratio = (float(point.threshold) - float(self.points[0].value)) / (float(self.points[1].value) - float(self.points[0].value))

O supongo que se podría echar a uno de los tipos numpy firmado.

¿Esos valores realmente necesitan ser uint16 en lugar de Int16? A menos que tengan que ser capaz de tomar valores de 2**15 o por encima (pero aún por debajo 2**16) podría simplemente mantenerlos como Int16 y hacer con ella - enteros sin signo, como has descubierto, puede ser complicado (y no sólo en numpy; -). Si es necesario el uint16, entonces arroja como David sugiere el trabajo voluntad, pero si simplemente puede utilizar Int16 que será más rápido y más fácil de leer.

Por cierto, parece que point.threshold que es un flotador, no un int (buena cosa también, de otro modo que la división de la forma en que se codifican sería un truncamiento uno, a menos que esté importando verdadera división del futuro, como se ha apoyado en muchos comunicados 2.* de Python - y es, finalmente, la forma en que funciona la división en 3.*). El .0 en 25.0 "da a la basura" y demuestra que es un flotador, no un int.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top