如何强制减法在Python中签名?

时间:2009-08-27 18:03:38

标签: python sign subtraction uint

如果您不关心背景,可以跳到底线:

我在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] are of the type numpy.uint16`,所以我得到了:

21 - 46 = 65511

虽然我从未为point.threshold定义类型。我刚刚分配了它。我想它有一个普通的香草int

底线

如何强制减去两个uint的签名?

3 个答案:

答案 0 :(得分:2)

嗯,显而易见的解决方案可能就是投射到花车:

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

或者我想你可以投射到其中一个numpy签名类型。

答案 1 :(得分:2)

几乎任何 uints都可以在这里工作,所以在进行减法之前,只需将这些内容转换为其他内容。

由于阈值= 25.0(注意小数点),它是一个浮点数,所以只要你没有使用uint,减法和除法都会有效。

答案 2 :(得分:0)

这些值实际上需要是uint16而不是int16吗?除非他们必须能够取2**15或更高的值(但仍然低于2**16),否则你可以简单地将它们保留为int16并完成它 - 如你所发现的那样,无符号整数可以是棘手(而不只是在numpy ;-)。如果你需要uint16,那么大卫建议的演员阵容会起作用,但是如果你可以简单地使用int16它会更快,更具可读性。

顺便说一句,它看起来像是point.threshold是一个浮点数,而不是一个int(也是好东西,否则你编码它的方式将是截断的,除非你从未来导入真正的除法,如同已经在许多2.*版本的Python中得到了支持 - 最后是3.*中的分区工作方式。 .0中的25.0将它“放弃”并显示它是浮点数,而不是int。