从以下Python代码:
val = 499997
val**3
我得到了一个合理的结果:124997750013499973。
但是,从下面的代码中使用numpy:
import numpy as np
val = 499997
np_val = np.arange(start=val, stop=val+1, dtype=np.uint64)
np_val**3
我得到了一个奇怪的结果:array([124997750013499968],dtype = uint64)
这是一个numpy的错误???
答案 0 :(得分:1)
似乎在某些时候已解决。现在在NumPy 1.17.3上尝试可以产生正确的输出:
In [1]: import numpy as np
...: val = 499997
...: np_val = np.arange(start=val, stop=val+1, dtype=np.uint64)
...: np_val**3
...:
Out[1]: array([124997750013499973], dtype=uint64)
In [2]: np.__version__
Out[2]: '1.17.3'
该错误很可能是由于将一些NumPy实现代码强制转换为float64来执行该操作,然后又进行了强制转换,从而产生了错误的输出:
In [3]: np_val.astype(float)**3
Out[3]: array([1.2499775e+17])
In [4]: _.astype('uint64')
Out[4]: array([124997750013499968], dtype=uint64)
尽管我确实找到了因该问题而产生的related bug report,但是我无法找到该问题的修订提交或错误报告。
答案 1 :(得分:-2)
这会产生垃圾:
years = np.arange(1980,2020)
yeartothe3 = years**3
在工作时
years = np.arange(1980,2020).astype(float)
yeartothe3 = years**3
years = np.arange(1980,2020)
yeartothe3 = years**3.0
一个真正的初学者陷阱...(叹气)