从numpy.genfromtxt()中排除

时间:2014-12-09 16:14:04

标签: python numpy import ascii

我必须将大型逗号分隔表导入为numpy数组。因此,我使用genfromtxt这样做。但是,我遇到这些表包含“foo,bar”形式括号中的元素,我甚至不需要这些元素。 在导入numpy期间,然后引发一个错误,即列数不一致,因为它将这些元素识别为两个单独的条目。如何在不知道这些条目的位置的情况下避免这种情况。如果这是不可能的,有没有办法明确地从导入中删除某些列,这可能包含这些值?我知道usecols,但我想要相反。另外,usecols也可能也错误地计算列的数量,因此排除不会以这种方式工作。

1 个答案:

答案 0 :(得分:1)

'invalid_raise'参数可能会有所帮助:

invalid_raise : bool, optional
    If True, an exception is raised if an inconsistency is detected in the
    number of columns.
    If False, a warning is emitted and the offending lines are skipped.

使用False,您的文件至少应该加载。

但是如果你仍然需要使用有问题的行,你还需要一些其他方法。

如果所有数据字段都排成一行,则delimited的列宽版本可能会有效。


genfromtxt接受一个生成器作为输入 - 也就是说,一次可以为它提供一行的函数。

使用re函数清理输入源中的(foo,bar)字符串的示例:

def foo(astr):
    # replace (foo,bar) with (foo:bar)
    return re.sub(r'\(([^,]*)(,)([^,]*)\)',r'(\1:\3)',astr)
txt = 'foo,2,3\n(foo,bar),5,6\nbar,8,9\n'
txt = txt.splitlines()
np.genfromtxt((foo(i) for i in txt),delimiter=',',dtype=None)

产生

array([('foo', 2, 3), ('(foo:bar)', 5, 6), ('bar', 8, 9)], 
  dtype=[('f0', 'S9'), ('f1', '<i4'), ('f2', '<i4')])

或从文件

with open('stack27383639.txt') as f:
    F=np.genfromtxt((foo(l) for l in f),dtype=None,names=True)