如何在Python中强制减法为有符号?

0 投票
3 回答
1187 浏览
提问于 2025-04-15 13:55

如果你不想了解背景,可以直接看结论:

我在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].valueself.points[1].value 的类型是 numpy.uint16,所以我得到了:

21 - 46 = 65511

而我从来没有为 point.threshold 定义过类型。我只是给它赋了值。我想它的类型是普通的 int

结论

我该如何强制让两个 uint 的减法结果为有符号数?

3 个回答

0

这些值真的需要用uint16而不是int16吗?除非它们必须能够表示2**15或更大的值(但仍然小于2**16),否则你可以直接用int16就行了——无符号整数,正如你发现的那样,可能会有点麻烦(而且不仅仅是在numpy中;-)。如果你确实需要uint16,那么像David建议的那样进行转换是可以的,但如果你可以简单地使用int16,那样会更快,也更容易理解。

顺便说一下,看起来point.threshold是一个浮点数,而不是整数(这也是好事,否则你那样写的除法会变成截断除法,除非你从未来导入真正的除法,这在许多2.*版本的Python中都有支持——而且在3.*中,除法的方式终于是这样的)。25.0中的.0表明它是一个浮点数,而不是整数。

2

那么,显而易见的解决办法可能就是把数据转换成浮点数:

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

或者我想你也可以把数据转换成numpy库中的某种有符号类型。

2

这里几乎任何类型都可以用,除了无符号整数(uint)。所以在你进行减法之前,可以把这些无符号整数转换成其他类型。

因为阈值是25.0(注意有小数点),所以它是一个浮点数。只要你不是用无符号整数,减法和除法都可以正常进行。

撰写回答