在genfromtxt中有多种处理头的方法。默认情况下,将它们视为数据的一部分:In [6]: txt="""time,topic1,topic2,country
...: 2015-10-01,20,30,usa
...: 2015-10-02,25,35,usa"""
In [7]: data=np.genfromtxt(txt.splitlines(),delimiter=',',skip_header=0)
In [8]: data
Out[8]:
array([[ nan, nan, nan, nan],
[ nan, 20., 30., nan],
[ nan, 25., 35., nan]])
但是由于默认的dtype是float,所以字符串都显示为nan。在
您可以将它们视为标头-结果是一个结构化数组。标题现在出现在data.dtype.names列表中。在
^{pr2}$
使用dtype=None,让它选择数据类型。基于第一行中的字符串,它以S10的形式加载所有内容。在In [11]: data=np.genfromtxt(txt.splitlines(),delimiter=',',dtype=None)
In [12]: data
Out[12]:
array([['time', 'topic1', 'topic2', 'country'],
['2015-10-01', '20', '30', 'usa'],
['2015-10-02', '25', '35', 'usa']],
dtype='|S10')
此矩阵可以转置、打印或写入csv文件:In [13]: data.T
Out[13]:
array([['time', '2015-10-01', '2015-10-02'],
['topic1', '20', '25'],
['topic2', '30', '35'],
['country', 'usa', 'usa']],
dtype='|S10')
因为我使用genfromtxt来加载,所以我可以使用savetxt来保存:In [26]: with open('test.txt','w') as f:
np.savetxt(f, data.T, delimiter=',', fmt='%12s')
np.savetxt(f, data.T, delimiter=';', fmt='%10s') # simulate a 2nd array
....:
In [27]: cat test.txt
time, 2015-10-01, 2015-10-02
topic1, 20, 25
topic2, 30, 35
country, usa, usa
time;2015-10-01;2015-10-02
topic1; 20; 25
topic2; 30; 35
country; usa; usa