在list-to-numpy-to-list之后的python中的异常小数位

时间:2012-11-29 15:37:30

标签: python numpy floating-point python-2.7

在我的ubuntu linux机器上的新的Python 2.7.3解释器中执行以下代码,会在代码后显示输出。

import numpy as np
p = [1/3., 1/2., 23/25., 1]
q = np.array(p)
r = list(q)
print p; print q; print r

输出:

[0.3333333333333333, 0.5, 0.92, 1]
[ 0.33333333  0.5         0.92        1.        ]
[0.33333333333333331, 0.5, 0.92000000000000004, 1.0]

我试图找出为什么p和r打印出来的方式不同,但到目前为止还没有一个合理的理论。关于他们为什么不同的任何想法?

2 个答案:

答案 0 :(得分:3)

他们的打印方式不同,因为pfloatint的列表,而rnumpy.float64的列表:

In [23]: map(type, p)
Out[23]: [float, float, float, int]

In [24]: map(type, r)
Out[24]: [numpy.float64, numpy.float64, numpy.float64, numpy.float64]

这是因为NumPy数组属于统一类型,所以当您创建float64时,所有内容都会扩展为q

两个列表中的值比较相等,所以它纯粹是格式化的差异:

In [22]: p == r
Out[22]: True

答案 1 :(得分:1)

我认为这对于__repr__np.float64的{​​{1}}的实现方式存在差异。

当您从numpy数组中创建一个列表时,您将获取元素(类型为float)并将它们放入列表中。因此,您实际上已将原始数据的类型从np.float64转换为float