Numpy的loadtxt和Pandas read_csv导致不同的float64表示

时间:2016-07-18 21:04:41

标签: python numpy pandas

以下代码是更大项目的一部分。 在我的项目中,我必须阅读一个大文本文件,可能有数百万行,每行有一对用空格分隔的小数。

以下是一个例子:

-0.200000 -1.000000
-0.469967 0.249733
-0.475169 -0.314739
-0.086706 -0.901599

到目前为止,我使用了一个由我创建的自定义解析器,它工作得很好但不是最快的解析器。在线搜索我找到了numpy的loadtxt和pandas read_csv。第一个效果很好,但它的速度比我的还差。第二个是相当快但我后来在我的项目中得到错误(我用有限元方法解决了一些PDE,在用我的解析器或loadtxt读取坐标时,我得到了正确的结果,当我使用read_csv时,矩阵A的系统Ax = b变为单数)。

所以我创建了这个测试代码,看看发生了什么:

import numpy as np
import pandas as pd

points_file = './points.txt'

points1 = pd.read_csv(points_file, header=None, sep='\s+', dtype=np.float64).values
points2 = np.loadtxt(points_file, dtype=np.float64)

if (np.array_equal(points1, points2)):
    print ('Equal')
else:
    print ('Not Equal')

for i in range(len(points1)):
    print (points1[i] == points2[i])

令人惊讶的是输出是:

Not Equal
[ True  True]
[ True False]
[False  True]
[False False]

我已经很困惑了,我继续搜索,我发现了{+ 3}}用户的功能" Dan Lecocq"得到数字的二进制表示。

因此,对于第二行中的第二个数字(0.249733),read_csv和loadtxt的二进制表示分别为:

0011111111001111111101110100000000111101110111011011000100100000
0011111111001111111101110100000000111101110111011011000100100001

和小数值:

2.49732999999999982776444085175E-1
2.49733000000000010532019700804E-1

为什么会这样?我的意思是,我从文本文件中读取相同的字符串,并将其作为相同的数据类型保存在内存中。我也很想理解为什么这个小差异会影响我的解决方案,但这会让你看到大约1000行我的杂乱代码。我首先需要创建更多测试代码,以确切找到问题所在。

软件版本:

Ubuntu 16.04 64bit
Python: 2.7.12
Numpy: 1.11.0
Pandas: 0.18.0

0 个答案:

没有答案