如果您不关心背景,可以跳到底线:
我在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
的签名?
答案 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它会更快,更具可读性。
2.*
版本的Python中得到了支持 - 最后是3.*
中的分区工作方式。 .0
中的25.0
将它“放弃”并显示它是浮点数,而不是int。