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

2024-04-25 20:20:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如:

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

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

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

^{pr2}$

出人意料的是:

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

已经很困惑了,我继续搜索,找到了来自用户“Dan Lecocq”的this函数来获得数字的二进制表示。在

因此,对于第二行中的第二个数字(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

Tags: csv项目代码numpyfalsetrue解析器read