我在尝试将 txt 文件加载到结构化数组中时遇到问题。
这是一个显示问题的简单示例。
这工作正常:
import numpy as np
from StringIO import StringIO
in1 = StringIO("123 456 789\n231 543 876")
a = np.loadtxt(in1, dtype=[('x', "int"), ('y', "int"), ('z', "int")])
####output
array([(123, 456, 789), (231, 543, 876)],
dtype=[('x', '<i8'), ('y', '<i8'), ('z', '<i8')])
但是,当其中一个字段包含小数时,尝试将其转换为 int 时出现错误:
in2 = StringIO("123 456 789\n231 543.0 876")
a = np.loadtxt(in2, dtype=[('x', "int"), ('y', "int"), ('z', "int")])
####error
ValueError: invalid literal for long() with base 10: '543.0'
我希望 python 能够将“543.0”之类的数字转换为 543 而不会引发错误。
如果它只是一个数字,我可以使用类似的东西
int(float("543.0"))
但是我可以结合 numpy 的 loadtxt 来做到这一点吗?
实际上,我要读取的文件大约为 2Gigs,并且具有长度为 37 的复杂 dtype,其中包含浮点数、字符串和整数的混合。
我试过 numpy.genfromtxt,它似乎适用于较小的文件,但它在 2gig 文件上占用了太多内存。
我考虑过的另一个选择是用 sed 截断所有以“.0”结尾的数字,这会起作用,但更像是一种 hack,而不是真正的解决方案。
有没有更蟒蛇的方法?
已回答(感谢Zhenya)...
dtypeTmp = np.dtype([(d[0], "<f8") if d[1] == "<i8" else d for d in dtype1.descr])
events = np.loadtxt("file.txt", dtype=dtypeTmp)
events.astype(dtype1)