Como posso forçar a subtração a ser assinada no Python?
-
20-09-2019 - |
Pergunta
Você pode pular para o resultado final se não se importa com o fundo:
Eu tenho o seguinte código em Python:
ratio = (point.threshold - self.points[0].value) / (self.points[1].value - self.points[0].value)
O que está me dando valores errados. Por exemplo, para:
threshold: 25.0
self.points[0].value: 46
self.points[1].value: 21
Eu obtive:
ratio: -0.000320556853048
O que está errado.
Olhando para isso, eu percebi que self.points[0].value
e self.points[1].value] are of the type
numpy.uint16`, então eu tenho:
21 - 46 = 65511
Embora eu nunca tenha definido um tipo para point.threshold
. Acabei de atribuir isso. Eu imagino que tenha uma baunilha simples int
.
A linha inferior
Como posso forçar a subtração de dois uint
s ser assinado?
Solução
Quase nada mas Os uints funcionarão aqui, então basta lançá -los para outra coisa antes de fazer a subtração.
Como o limiar = 25.0 (observe o ponto decimal), é um flutuador, portanto a subtração e a divisão funcionarão enquanto você não estiver usando o UINTS.
Outras dicas
Bem, a solução óbvia provavelmente seria lançar para flutuar:
ratio = (float(point.threshold) - float(self.points[0].value)) / (float(self.points[1].value) - float(self.points[0].value))
Ou suponho que você possa ser lançado para um dos tipos assinados por Numpy.
Esses valores realmente precisam ser uint16 em vez de int16? A menos que eles tenham que ser capazes de tomar valores de 2**15
ou acima (mas ainda abaixo 2**16
) Você pode simplesmente mantê-los como INT16 e acabar com isso-INTs não assinados, como você descobriu, pode ser complicado (e não apenas em Numpy ;-). Se você precisar do UINT16, os elenco como David sugere funcionará, mas se você pode simplesmente usar o INT16, será mais rápido e mais legível.
BTW, parece que esse ponto. em muitos 2.*
lançamentos de python - e finalmente é a maneira como a divisão funciona em 3.*
). o .0
dentro 25.0
"Dari -lo" e mostra que é um flutuador, não um int.