Как я могу заставить вычитание быть подписанным в Python? - PullRequest
0 голосов
/ 27 августа 2009

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

У меня есть следующий код в 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 s быть подписанным?

Ответы [ 3 ]

2 голосов
/ 27 августа 2009

Почти все , но уинты будут работать здесь, так что просто приведите их к чему-то еще, прежде чем делать вычитание.

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

2 голосов
/ 27 августа 2009

Что ж, очевидным решением, вероятно, будет приведение к типу float:

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

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

0 голосов
/ 27 августа 2009

Должны ли эти значения действительно быть uint16 вместо int16? Если они не должны иметь возможность принимать значения 2**15 или выше (но все же ниже 2**16), вы можете просто оставить их как int16 и покончить с этим - целые числа без знака, как вы обнаружили, могут быть хитрыми (и не просто в numy ;-). Если вам действительно нужен uint16, то приведение, как предполагает Дэвид, будет работать, но если вы сможете просто использовать int16, оно будет быстрее и более читабельным.

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

...