基本上,我有一堆数据,其中第一列是字符串(标签),其余列是数值.我执行以下操作:
data = numpy.genfromtxt('data.txt', delimiter = ',')
Run Code Online (Sandbox Code Playgroud)
这很好地读取了大部分数据,但标签列只是'nan'.我怎么处理这个?
Pie*_* GM 60
默认情况下,np.genfromtxt使用dtype=float:这就是你将字符串列转换为NaN的原因,因为毕竟它们不是一个数字......
您可以np.genfromtxt通过使用dtype=None以下方法尝试猜测列的实际类型:
>>> from StringIO import StringIO
>>> test = "a,1,2\nb,3,4"
>>> a = np.genfromtxt(StringIO(test), delimiter=",", dtype=None)
>>> print a
array([('a',1,2),('b',3,4)], dtype=[('f0', '|S1'),('f1', '<i8'),('f2', '<i8')])
Run Code Online (Sandbox Code Playgroud)
您可以使用他们的名称访问列,例如a['f0']......
dtype=None如果您不知道列应该是什么,使用是一个很好的技巧.如果您已经知道它们应该具有哪种类型,您可以明确说明dtype.例如,在我们的测试中,我们知道第一列是一个字符串,第二列是一个int,我们希望第三列是一个浮点数.然后我们会用
>>> np.genfromtxt(StringIO(test), delimiter=",", dtype=("|S10", int, float))
array([('a', 1, 2.0), ('b', 3, 4.0)],
dtype=[('f0', '|S10'), ('f1', '<i8'), ('f2', '<f8')])
Run Code Online (Sandbox Code Playgroud)
使用显式dtype比使用更有效,dtype=None并且是推荐的方式.
在这两种情况下(dtype=None或显式,非同类dtype),您最终得到一个结构化数组.
[注意:使用dtype=None,输入被第二次解析,并且每列的类型被更新以匹配可能的更大类型:首先我们尝试bool,然后是int,然后是float,然后是复数,然后我们保持一个字符串如果一切都失败了.实际上,实施相当笨重.有一些尝试使类型猜测更有效(使用正则表达式),但到目前为止没有任何东西]
fel*_*ian 30
如果您的数据文件结构如下
col1, col2, col3
1, 2, 3
10, 20, 30
100, 200, 300
Run Code Online (Sandbox Code Playgroud)
然后numpy.genfromtxt可以使用该names=True选项将第一行解释为列标题.有了这个,您可以通过提供列标题非常方便地访问数据:
data = np.genfromtxt('data.txt', delimiter=',', names=True)
print data['col1'] # array([ 1., 10., 100.])
print data['col2'] # array([ 2., 20., 200.])
print data['col3'] # array([ 3., 30., 300.])
Run Code Online (Sandbox Code Playgroud)
因为在您的情况下数据是这样形成的
row1, 1, 10, 100
row2, 2, 20, 200
row3, 3, 30, 300
Run Code Online (Sandbox Code Playgroud)
您可以使用以下代码段实现类似的功能:
labels = np.genfromtxt('data.txt', delimiter=',', usecols=0, dtype=str)
raw_data = np.genfromtxt('data.txt', delimiter=',')[:,1:]
data = {label: row for label, row in zip(labels, raw_data)}
Run Code Online (Sandbox Code Playgroud)
第一行将第一列(标签)读入字符串数组.第二行读取文件中的所有数据,但丢弃第一列.第三行使用字典理解来创建一个字典,它可以像numpy.genfromtxt使用names=True选项创建的结构化数组一样使用:
print data['row1'] # array([ 1., 10., 100.])
print data['row2'] # array([ 2., 20., 200.])
print data['row3'] # array([ 3., 30., 300.])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
85871 次 |
| 最近记录: |