In [280]: txt=[' 0 : 16, 250 : 1 : 0.053 :RIG : DIS : 1 : 48, 220; 2
...: : 42, 241; 2 : 43, 251; 3 : 25, 266; 1 : 36, 287; 2 '
...: ]
In [282]: np.genfromtxt(txt,delimiter=':',dtype=None, encoding=None)
Out[282]:
array((0, ' 16, 250 ', 1, 0.053, 'RIG ', ' DIS ', 1, ' 48, 220; 2 ', ' 42, 241; 2 ', ' 43, 251; 3 ', ' 25, 266; 1 ', ' 36, 287; 2'),
dtype=[('f0', '
这是一个有11个字段的结构化数组,它混合了整数、字符串和浮点数。这是因为dtype=None告诉它为每个列推断数据类型。在
在,上拆分将生成一个7列数组(这里是1d,因为只有一个输入行,但是如果有更多的输入行,则是2d):
^{pr2}$
但请注意,这都是弦乐。在
genfromtxt不接受多个分隔符,但它接受来自任何为其提供行的输入。在
因此,如果我定义一个替换分隔符的函数:In [285]: def foo(astr):
...: return astr.replace(':',',').replace(';',',')
...:
...:
In [286]: np.genfromtxt([foo(a) for a in txt],delimiter=',',dtype=None, encoding
...: =None)
Out[286]:
array((0, 16, 250, 1, 0.053, 'RIG ', ' DIS ', 1, 48, 220, 2, 42, 241, 2, 43, 251, 3, 25, 266, 1, 36, 287, 2),
dtype=[('f0', '
现在我已经将输入分解成一个有23个字段的结构化数组,同样是int、float和(更小)字符串的混合。在
genfromtxt让我定义一个dtype,它可以将子字段组合在一起。在
例如,尝试处理前6列:In [298]: dt = np.dtype([('f0','i'),('f1','i',2),('f2','i'),('f3','i'),('f4','U3
...: ')])
In [299]: np.genfromtxt([foo(a) for a in txt],delimiter=',',dtype=dt, encoding=N
...: one,usecols=range(6))
Out[299]:
array((0, [ 16, 250], 1, 0, 'RIG'),
dtype=[('f0', '
我已经将'16,250'分组到一个包含2个整数的字段中。后来的“48220;2,42241;2”可以嵌套3个字段(由“;”定义),并嵌套在2,2和1子字段中。在
genfromtxt接受另一种形式的定界符-固定字段宽度。在
速度方面,genfromtxt并没有比你自己的滚动有任何改进。它仍然需要读取每一行,将其拆分,并将值收集到一个列表列表中。最后它将其转换为一个数组。在
pandas有一个更快的csv读卡器,但这种情况可能太复杂而无法使用。engine=python参数强制它使用较慢的全python版本。在