Как я могу принудительно подписать вычитание в Python?
-
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 type
numpy.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
«отдает» и показывает, что это число с плавающей запятой, а не целое число.