[英]very strange results of numpy.astype with numba
为什么? 很奇怪......在 python 中,如果我们用numba
测试 np.astype() ,下面将打印一些结果为
x: [-6. -5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.]
x-int: [-6 -5 -4 -3 -2 -1 0 1 2 3 4 5]
@numba.njit
def tt():
nn = 3
x = np.linspace(0, 4*nn-1, 4*nn)-2*nn
print(x)
print(x.astype(np.int32))
但是,如果我将 x 的行更改为x = np.linspace(0, 8*nn-1, 8*nn)-4*nn
,结果会很奇怪
x: [-12. -11. -10. -9. -8. -7. -6. -5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.]
x-int: [-12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 0 2 3 4 5 6 7 8 9 10 11]
x-int中有两个0
? 为什么?
tl;dr:这是 Numba 报告的错误。
该问题来自与浮点舍入相关的 Numba linspace
function 中的略微不准确。 这是一个突出问题的示例:
def tt_classic():
nn = 3
return np.linspace(0, 8*nn-1, 8*nn)-4*nn
@numba.njit
def tt_numba():
nn = 3
return np.linspace(0, 8*nn-1, 8*nn)-4*nn
print(tt_classic()[13])
print(tt_numba()[13])
结果如下:
1.0
0.9999999999999982
如您所见,Numba 实现不会返回精确值。 虽然对于大值无法避免这个问题,但对于如此小的值,它可以被视为一个错误,因为它们可以在任何 IEEE-754 平台上精确表示(不会损失任何精度)。
因此,强制转换会将浮点数 0.9999999999999982 截断为 0(而不是最接近的 integer )。 如果你想要一个安全的转换(即解决方法),你可以明确告诉 Numpy/Numba 去做。 这是一个例子:
@numba.njit
def tt():
nn = 3
x = np.linspace(0, 4*nn-1, 4*nn)-2*nn
np.round(x, 0, x)
print(x)
print(x.astype(np.int32))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.