当字符串包含decim时,numpy的loadtxt在转换为int时出错

2024-10-01 13:44:21 发布

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

我在尝试将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)

Tags: 文件importnumpytxtnp数字eventsint
2条回答

无需手动编辑任何内容:

>>> in2 = StringIO("123 456 789\n231 543.0 876")
>>> dt_temp = np.dtype([('x', "int"), ('y', "float"), ('z', "int")])
>>> a = np.loadtxt(in2, dtype=dt_temp)
>>> 
>>> dt = np.dtype([('x', "int"), ('y', "int"), ('z', "int")])
>>> b = a.astype(dt)
>>> b
array([(123, 456, 789), (231, 543, 876)], 
      dtype=[('x', '<i8'), ('y', '<i8'), ('z', '<i8')])

对于应该是整数的字段,可以使用int(float(fieldval))的转换器。下面显示了一种基于数据类型以编程方式创建loadtxtconverters参数的方法:

In [77]: in3 = StringIO("123.0 456 789 0.95\n231 543.0 876 0.87")

In [78]: dt = dtype([('x', "int"), ('y', "int"), ('z', "int"), ('r', "float")])

In [79]: converters = dict((k, lambda s: int(float(s))) for k in range(len(dt)) if np.issubdtype(dt[k], np.integer))

In [80]: converters
Out[80]: 
{0: <function __main__.<lambda>>,
 1: <function __main__.<lambda>>,
 2: <function __main__.<lambda>>}

In [81]: a = np.loadtxt(in3, dtype=dt, converters=converters)

In [82]: a
Out[82]: 
array([(123, 456, 789, 0.95), (231, 543, 876, 0.87)], 
      dtype=[('x', '<i8'), ('y', '<i8'), ('z', '<i8'), ('r', '<f8')])

即使这样,在2gig文件上使用loadtxt时,仍然可能遇到性能或内存问题。你查过pandas了吗?它的csv阅读器比numpy的阅读器快得多。在

相关问题 更多 >