numpy数组上的幂运算符**返回一个奇怪的结果。这是一个错误吗?

时间:2017-03-22 06:03:45

标签: python numpy

从以下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的错误???

2 个答案:

答案 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

一个真正的初学者陷阱...(叹气)