2014-02-06 28 views
0

我有一些数学运算,产生一个numpy结果数组,有8位有效数字。当我在我的阵列y_axis上使用tolist()时,它会创建我所假设的32位数字。为什么numpy数组的.tolist()创建长双打?

但是,我不知道这是否只是垃圾。我认为它垃圾,但它似乎足够聪明,可以改变最后一个数字,以便四舍五入有意义。

print "y_axis:",y_axis 
y_axis = y_axis.tolist() 
print "y_axis:",y_axis 

y_axis: [-0.99636686 0.08357361 -0.01638707] 
y_axis: [-0.9963668578012771, 0.08357361233570479, -0.01638706796138937] 

所以我的问题是:如果这是垃圾,使用不tolist实际精度帮助我的计算,或者Python中始终使用整个数字,只是没有显示呢?

回答

1

当您在numpy数组上调用​​时,会得到numpy实际存储在内部的数字的截断版本。截断方式取决于numpy打印选项的设置方式。

>>> arr = np.array([22/7, 1/13])   # init array 
>>> arr         # np.array default printing 
array([ 3.14285714, 0.07692308]) 
>>> arr[0]         # int default printing 
3.1428571428571428 
>>> np.set_printoptions(precision=24)  # increase np.array print "precision" 
>>> arr         # np.array high-"precision" print 
array([ 3.142857142857142793701541, 0.076923076923076927347012]) 
>>> float.hex(arr[0])      # actual underlying representation 
'0x1.9249249249249p+1' 

它看起来像你“获得精确度”,当你打印出来的y_axis.tolist()版形式的原因是,默认情况下,当你的清单上调用print比当你调用print更多的数字印刷在一个numpy数组上。

在实际中,由任一列表或numpy的阵列存储在内部的数字应该是相同的(并且应该对应于上面的最后一行,与float.hex(arr[0])生成),由于numpy的默认使用numpy.float64和Python float对象也64位默认情况下。

0

我的理解是,numpy没有向您展示使矩阵始终如一的完整精度。该列表不应该比其对应的numpy.array更精确:

>>> v = -0.9963668578012771 
>>> a = numpy.array([v]) 
>>> a 
array([-0.99636686]) 
>>> a.tolist() 
[-0.9963668578012771] 
>>> a[0] == v 
True 
>>> a.tolist()[0] == v 
True