Tom*_*m_K 8 python numpy pandas
以下代码是一个更大项目的一部分。在我的项目中,我必须阅读一个大文本文件,可能有几百万行,每行都有一对用空格分隔的小数。
一个例子如下:
-0.200000 -1.000000
-0.469967 0.249733
-0.475169 -0.314739
-0.086706 -0.901599
Run Code Online (Sandbox Code Playgroud)
到目前为止,我使用了一个由我创建的定制解析器,它运行良好,但不是最快的。在线搜索我发现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])
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,输出是:
Not Equal
[ True True]
[ True False]
[False True]
[False False]
Run Code Online (Sandbox Code Playgroud)
已经很困惑,我继续搜索,我从用户“Dan Lecocq”那里找到了这个函数来获取数字的二进制表示。
因此,对于第二行中的第二个数字 (0.249733),来自 read_csv 和 loadtxt 的二进制表示分别为:
0011111111001111111101110100000000111101110111011011000100100000
0011111111001111111101110100000000111101110111011011000100100001
Run Code Online (Sandbox Code Playgroud)
和十进制值:
2.49732999999999982776444085175E-1
2.49733000000000010532019700804E-1
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我的意思是,我从文本文件中读取了相同的字符串,并将其作为相同的数据类型保存在内存中。我也很想了解为什么这个微小的差异对我的解决方案影响如此之大,但这涉及向您展示大约 1000 行我凌乱的代码。我首先需要创建更多的测试代码来准确找出问题所在。
软件版本:
Ubuntu 16.04 64bit
Python: 2.7.12
Numpy: 1.11.0
Pandas: 0.18.0
Run Code Online (Sandbox Code Playgroud)
小智 1
我会问自己以下问题:我的项目需要多少精度?
如果您可以承受丢失一些数字,我建议使用 pandas 或 numpy round()。
请记住,浮动处理总是很挑剔的。有用的资源可能是: 纠正 pandas 舍入时的浮点算术“错误”
,或者如果您对浮点表示一无所知: https://docs.python.org/3/tutorial/floatingpoint.html
| 归档时间: |
|
| 查看次数: |
2642 次 |
| 最近记录: |