为什么numpy数组的.tolist()会创建长双精度数?

时间:2014-02-06 00:45:26

标签: python numpy precision

我有一些数学运算产生numpy数组结果,大约有8位有效数字。当我在我的数组tolist()上使用y_axis时,会创建我认为是32位数字的内容。

然而,我想知道这是不是垃圾。我认为垃圾,但它似乎足够聪明,可以更改最后一个数字,以便舍入有意义。

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总是使用整数,但只是不显示它?

2 个答案:

答案 0 :(得分:1)

当您在numpy数组上调用print y_axis时,您将获得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'

当您打印.tolist() y_axis print格式时,您看起来“获得准确性”的原因是,默认情况下,当您拨打print时会打印更多数字在列表上比在numpy数组上调用float.hex(arr[0])时。

实际上,list或numpy数组内部存储的数字应该相同(并且应该对应于上面的最后一行,使用numpy.float64生成),因为numpy默认使用float ,默认情况下,python {{1}}对象也是64位。

答案 1 :(得分: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