Как я могу принудительно подписать вычитание в Python?

StackOverflow https://stackoverflow.com/questions/1342782

  •  20-09-2019
  •  | 
  •  

Вопрос

Вы можете перейти к нижней строке, если вас не волнует фон:

У меня есть следующий код на Python:

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

Это дает мне неправильные ценности.Например, для:

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

Я получил:

ratio:  -0.000320556853048

Это неправильно.

Посмотрев на это, я понял, что self.points[0].value и self.points[1].value] are of the typenumpy.uint16`, поэтому я получил:

21 - 46 = 65511

Хотя я никогда не определял тип для point.threshold.Я просто назначил это.Я думаю, там обычная ваниль int.

Нижняя линия

Как я могу заставить вычитание двух uintнужно подписать?

Это было полезно?

Решение

Почти все но Здесь подойдут uints, поэтому просто приведите их к чему-нибудь другому, прежде чем выполнять вычитание.

Поскольку порог = 25,0 (обратите внимание на десятичную точку), это число с плавающей запятой, поэтому вычитание и деление будут работать, пока вы не используете uint.

Другие советы

Что ж, очевидным решением, вероятно, было бы приведение к числам с плавающей запятой:

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

Или, я полагаю, вы могли бы привести к одному из типов со знаком numpy.

Действительно ли эти значения ДОЛЖНЫ быть uint16 вместо int16?Если они не должны иметь возможность принимать значения 2**15 или выше (но все же ниже 2**16) вы могли бы просто сохранить их как int16 и покончить с этим - беззнаковые целые числа, как вы обнаружили, могут быть непростыми (и не только в numpy ;-).Если вам ДЕЙСТВИТЕЛЬНО нужен uint16, то приведения, как предлагает Дэвид, будут работать, но если вы можете просто использовать int16, это будет быстрее и читабельнее.

Кстати, похоже, что point.threshold - это число с плавающей запятой, а не int (это тоже хорошо, иначе это деление, как вы его кодируете, будет усекающим, если только вы не импортируете истинное деление из будущего, как это поддерживается во многих 2.* выпусков Python — и, наконец, это ТАК, как работает разделение в 3.*).А .0 в 25.0 «отдает» и показывает, что это число с плавающей запятой, а не целое число.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top