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 typenumpy.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 uints ser assinado?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top