我在尝试将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时出错:
^{pr2}$我希望python能够在不抛出错误的情况下将“543.0”之类的数字转换为543。在
如果只是一个数字,我可以用
int(float("543.0"))
但是我可以和numpy的loadtxt结合使用吗?在
实际上,我试图读取的文件大约是2Gigs,它有一个长度为37的复杂数据类型,包含浮点、字符串和整数的混合。在
我试过了numpy.genfromtxt,这似乎适用于较小的文件,但它占用了2gig文件的太多内存。在
我考虑过的另一个选择是用sed截断所有以“.0”结尾的数字,这是可行的,但它更像是一种黑客行为,而不是真正的解决方案。在
有没有更像Python的方法?在
回答了(谢谢振亚)。。。在
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)
无需手动编辑任何内容:
对于应该是整数的字段,可以使用
int(float(fieldval))
的转换器。下面显示了一种基于数据类型以编程方式创建loadtxt
converters
参数的方法:即使这样,在2gig文件上使用
loadtxt
时,仍然可能遇到性能或内存问题。你查过pandas
了吗?它的csv阅读器比numpy的阅读器快得多。在相关问题 更多 >
编程相关推荐