NumPy genfromtxt:正确使用filling_missing
Posted
技术标签:
【中文标题】NumPy genfromtxt:正确使用filling_missing【英文标题】:NumPy genfromtxt: using filling_missing correctly 【发布时间】:2013-02-15 03:56:43 【问题描述】:我正在尝试处理保存到 CSV 的数据,这些数据可能在未知数量的列(最多约 30 个)中有缺失值。我正在尝试使用genfromtxt
的filling_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=0
和 filling_values=None:0
可以工作,但它们不会,并且分别抛出错误。当您指定正确的列 (filling_values=1:0
) 时,它将起作用,但由于在用户选择之前我有大量未知数的列,我正在寻找自动设置填充值的方法,如用户指南提示在。
我想我可能可以提前计算列并创建一个 dict 作为值同时传递给filling_values,但是有更好的方法吗?
【问题讨论】:
存在一个错误报告:projects.scipy.org/numpy/ticket/1722 谢谢,我在 github 错误跟踪器上添加了对该问题的评论。 github.com/numpy/numpy/issues/2317 该bug现已在numpy开发版中修复:github.com/numpy/numpy/pull/4968 【参考方案1】:这在文档中并不明显,但 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 问题,据说引号在那里没有帮助,所以我没有费心在这里尝试。以上是关于NumPy genfromtxt:正确使用filling_missing的主要内容,如果未能解决你的问题,请参考以下文章
numpy genfromtxt IndexError 使用评论时
使用 numpy.genfromtxt 读取包含逗号的字符串的 csv 文件