NumPy genfromtxt:正确使用filling_missing

8

我试图处理保存在CSV中的数据,这些数据可能在未知数量的列(最多约30列)中缺少值。我试图使用genfromtxtfilling_missing参数将这些缺失的值设置为“0”。以下是针对在Win 7上运行的ActiveState ActivePython 2.7 32位中numpy 1.6.2的最小工作示例。

import numpy

text = "a,b,c,d\n1,2,3,4\n5,,7,8"
a = numpy.genfromtxt('test.txt',delimiter=',',names=True)
b = open('test.txt','w')
b.write(text)
b.close()
a = numpy.genfromtxt('test.txt',delimiter=',',names=True)
print "plain",a

a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values=0)
print "filling_values=0",a

a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values={1:0})
print "filling_values={1:0}",a

a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values={0:0})
print "filling_values={0:0}",a

a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values={None:0})
print "filling_values={None:0}",a

结果如下:

plain [(1.0, 2.0, 3.0, 4.0) (5.0, nan, 7.0, 8.0)]
filling_values=0 [(1.0, 2.0, 3.0, 4.0) (5.0, nan, 7.0, 8.0)]
filling_values={1:0} [(1.0, 2.0, 3.0, 4.0) (5.0, 0.0, 7.0, 8.0)]
filling_values={0:0} [(1.0, 2.0, 3.0, 4.0) (5.0, nan, 7.0, 8.0)]

Traceback (most recent call last):
  File "C:\Users\tolivo.EE\Documents\active\eng\python\sizer\testGenfromtxt.py", line 20, in <module>
    a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values={None:0})
  File "C:\Users\tolivo.EE\AppData\Roaming\Python\Python27\site-packages\numpy\lib\npyio.py", line 1451, in genfromtxt
    filling_values[key] = val
TypeError: list indices must be integers, not NoneType

从NumPy用户指南中,我期望filling_values=0filling_values={None:0}可以正常工作,但实际上它们不起作用,并分别抛出错误。当你指定正确的列(filling_values={1:0})时,它可以工作,但由于我有大量未知数量的列在用户选择之前,我正在寻找一种自动设置填充值的方法,就像用户指南所提示的那样。
我想我可能可以提前计算列数并创建一个字典作为填充值传递,但是否有更好的方法?

存在一个错误报告:http://projects.scipy.org/numpy/ticket/1722 - Holger
谢谢,我在 Github 的 bug 追踪器上添加了一条评论。https://github.com/numpy/numpy/issues/2317 - Thav
1
错误现在已在NumPy的开发版本中修复:https://github.com/numpy/numpy/pull/4968 - Warren Weckesser
1个回答

8

从文档上看不出来,但是filling_values="0"是有效的。

In [19]: !cat test.txt
a,b,c,d
1,2,3,4
5,,7,8
9,10,,12

In [20]: a = numpy.genfromtxt('test.txt', delimiter=',', names=True, filling_values="0")

In [21]: print a
[(1.0, 2.0, 3.0, 4.0) (5.0, 0.0, 7.0, 8.0) (9.0, 10.0, 0.0, 12.0)]

对我来说可以这样做!我看到了另一个关于missing_values参数的SO问题,那里说引号没有帮助,所以我就没在这里尝试。 - Thav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接