我有一个这种形式的文件:
label1, value1, value2, value3,
label2, value1, value2, value3,
...
我想用numpy loadtxt函数读取它,所以我可以让每个标签的值都在一个数组中,所以最终结果将是一个数组数组,每个数组都包含标签和一个像这样的特征数组:
array([[label1, [value1, value2, value3]],
[label2, [value1, value2, value3]]])
我尝试过以下但没有奏效:
c = StringIO(u"text.txt")
np.loadtxt(c,
dtype={'samples': ('label', 'features'), 'formats': ('s9',np.float)},
delimiter=',', skiprows=0)
任何想法?
答案 0 :(得分:2)
最现代和最通用的方法是使用pandas,其解析器有更多选项和管理标签。
假设您的文件包含:
A,7,5,1
B,4,2,7
然后:
In [29]: import pandas as pd
In [30]: df=pd.read_csv('data.csv',sep=',',header=None,index_col=0)
In [31]: df
Out[31]:
1 2 3
0
A 7 5 1
B 4 2 7
您现在可以在结构数组中轻松转换它:
In [32]: a=df.T.to_records(index=False)
Out[32]:
rec.array([(7, 4), (5, 2), (1, 7)],
dtype=[('A', '<i8'), ('B', '<i8')])
In [33]: a['A']
Out[33]: array([7, 5, 1], dtype=int64)
使用loadtext
,您必须手动执行大量低级别操作。
答案 1 :(得分:1)
您正确定义了dtype。你只是错过了字段形状。
我将演示:
A&#39; text&#39; file - 行列表(Py3中的字节):
In [95]: txt=b"""label1, 12, 23.2, 232
....: label2, 23, 2324, 324
....: label3, 34, 123, 2141
....: label4, 0, 2, 3
....: """
In [96]: txt=txt.splitlines()
dtype
有2个字段,一个有字符串,另一个有浮点数(3个用于&#39;字段形状&#39;):
In [98]: dt=np.dtype([('label','U10'),('values', 'float',(3))])
In [99]: data=np.genfromtxt(txt,delimiter=',',dtype=dt)
In [100]: data
Out[100]:
array([('label1', [12.0, 23.2, 232.0]), ('label2', [23.0, 2324.0, 324.0]),
('label3', [34.0, 123.0, 2141.0]), ('label4', [0.0, 2.0, 3.0])],
dtype=[('label', '<U10'), ('values', '<f8', (3,))])
In [101]: data['label']
Out[101]:
array(['label1', 'label2', 'label3', 'label4'],
dtype='<U10')
In [103]: data['values']
Out[103]:
array([[ 1.20000000e+01, 2.32000000e+01, 2.32000000e+02],
[ 2.30000000e+01, 2.32400000e+03, 3.24000000e+02],
[ 3.40000000e+01, 1.23000000e+02, 2.14100000e+03],
[ 0.00000000e+00, 2.00000000e+00, 3.00000000e+00]])
使用此定义,可以将数值作为2d数组进行访问。像这样的子阵列不受欢迎。
可以使用字典语法指定dtype
,但我更熟悉元组表单列表。
等效dtype规格:
np.dtype("U10, (3,)f")
np.dtype({'names':['label','values'], 'formats':['S10','(3,)f']})
np.genfromtxt(txt,delimiter=',',dtype='S10,(3,)f')
===============================
我认为这个txt如果用dtype=None
解析将会产生
In [30]: y
Out[30]:
array([('label1', 12.0, 23.2, 232.0), ('label2', 23.0, 2324.0, 324.0),
('label3', 34.0, 123.0, 2141.0), ('label4', 0.0, 2.0, 3.0)],
dtype=[('f0', '<U10'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')])
可以使用
转换为子字段表单y.view(dt)
只要底层数据表示(看作平面字节列表)兼容(这里有10个unicode字符(40个字节),每个记录有3个浮点数),这就可以工作。