2009-08-27 36 views
0

您可以跳过底线,如果你不关心背景:如何强制减法在Python中签名?

我在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 S中的减法要签名?

回答

2

几乎所有的东西 uints将在这里工作,所以只需在做减法操作之前将它们转换为其他东西。因为threshold = 25.0(注意小数点),所以它是一个浮点数,所以只要不使用uint,减法和除法都将工作。

2

那么,显而易见的解决方案很可能会投给花车:

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

或者,我想你可以强制转换为numpy的符号类型之一。

0

这些值实际上需要是uint16而不是int16吗?除非他们必须能够获得2**15或更高的值(但仍然低于2**16),否则您可以简单地将它们保留为int16并完成它 - 正如您发现的,未签名的整数可能会非常棘手(而不仅仅是numpy; - )。如果你需要uint16,然后按照David的建议工作,但如果你可以简单地使用int16,它会更快,更具可读性。

顺便说一句,它看起来像那个point.threshold是一个浮点数,而不是一个整数(也是好事,否则除非你从未来导入真正的分割,否则这种分割方式对你的代码将是截断的,正如许多2.*版本的Python所支持的那样 - 并且最终在3.*中工作。 “”中的.0“给出了它”并显示它是一个浮点数,而不是整数。

+0

我正在读取数据是uint16格式的二进制文件中的数据。我也从未来导入了真正的分区 – 2009-08-27 18:48:14

+0

但是他们是否需要无符号的,即他们实际上是否在'2 ** 15'和'2 ** 16'之间取值?否则,无符号与有符号整数的二进制格式没有区别。 – 2009-08-28 05:23:38

相关问题