我有一些数学运算产生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总是使用整数,但只是不显示它?
答案 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