python - 使用numpy读取具有Fortran格式的小浮点数的文件

原文 标签 python numpy floating-point fortran

我正在尝试读取由Fortran程序编写的数据文件,其中有时每隔一段时间会有一个非常小的浮点,如0.3299880-104。错误消息是:

>np.loadtxt(filename, usecols = (1,))

  File "/home/anaconda2/lib/python2.7/site-packages/numpy/lib/npyio.py", line 928, in loadtxt
    items = [conv(val) for (conv, val) in zip(converters, vals)]

  File "/home/anaconda2/lib/python2.7/site-packages/numpy/lib/npyio.py", line 659, in floatconv
    return float(x)

ValueError: invalid literal for float(): 0.3299880-104


我是否可以做一些事情使Numpy仍然能够读取此数据文件?

最佳答案

就像@agentp在评论中提到的那样,一种方法是使用converters=np.genfromtxt参数在强制转换为float之前插入e字符:

import numpy as np

# some example strings
strings = "0.3299880-104 0.3299880+104 0.3299880"

# create a "dummy file" (see http://stackoverflow.com/a/11970414/1461210)
try:
    from StringIO import StringIO     # Python2
    f = StringIO(strings)
except ImportError:
    from io import BytesIO            # Python3
    f = BytesIO(strings.encode())

c = lambda s: float(s.decode().replace('+', 'e').replace('-', 'e-'))

data = np.genfromtxt(f, converters=dict(zip(range(3), [c]*3)))

print(repr(data))
# array([  3.29988000e-105,   3.29988000e+103,   3.29988000e-001])

相关文章:

python - 有没有有效的方法可以在适当通知的情况下验证许多变量?

python - 如何将字符串的Numpy数组(带逗号)保存到CSV?

java - 使用FloatMath或Math和演员?

python - 完全矢量化numpy polyfit

python - 检查两个数值是否在numpy(+/-)中具有相同的符号

c - 计数浮点数中`.`之后的位数?

java - NaN的位模式是否真的依赖于硬件?

c# - 一个像Python的collections.Counter库的C#库 - >在C#中获取两个字典对象之间的值的区别

python - 计算numpy ndarray中的元素数

python - Raspberry Pi RuntimeError:此GPIO通道已启用冲突边缘检测