0

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

我在 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 typenumpy.uint16`,所以我得到了:

21 - 46 = 65511

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

底线

我怎样才能强制两个uints 的减法被签名?

4

3 回答 3

2

好吧,显而易见的解决方案可能是强制转换为浮点数:

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

或者我想您可以转换为其中一种 numpy 签名类型。

于 2009-08-27T18:11:59.597 回答
2

除了uint 之外,几乎所有东西都可以在这里工作,所以在你做减法之前把它们转换成别的东西。

由于阈值 = 25.0(注意小数点),它是一个浮点数,因此只要您不使用 uint,减法和除法都将起作用。

于 2009-08-27T18:24:35.110 回答
0

这些值实际上是否需要为 uint16 而不是 int16?除非它们必须能够采用2**15或高于(但仍低于2**16)的值,否则您可以简单地将它们保留为 int16 并完成它 - 正如您发现的那样,无符号整数可能很棘手(而不仅仅是在 numpy 中;-) . 如果您确实需要 uint16,那么 David 建议的强制转换将起作用,但如果您可以简单地使用 int16,它会更快且更具可读性。

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

于 2009-08-27T18:24:44.343 回答