numpy genfromtxt 转换器未知列数
我有几个数据文件,里面的数字小数点是用逗号来表示的。所以我用一个叫做lambda的函数来进行转换:
import numpy as np
def decimal_converter(num_cols):
conv = dict((col, lambda valstr: \
float(valstr.decode('utf-8').replace(',', '.'))) for col in range(nb_cols))
return conv
data = np.genfromtxt("file.csv", converters = decimal_converter(3))
文件里的数据是这样的:
0; 0,28321815; 0,5819178
1; 0,56868281; 0,85621369
2; 0,24022026; 0,53490058
3; 0,63641921; 0,0293904
4; 0,65585546; 0,55913776
在我的函数 decimal_converter
中,我需要指定文件有多少列。通常情况下,我不需要告诉 numpy.genfromtxt
文件有多少列,它会自动读取所有找到的内容。我希望在使用转换器选项的时候,也能保留这个功能。
2 个回答
3
使用pandas
这个库可能不是你的选择,但如果可以的话,它的一个功能read_csv
有一个叫decimal
的参数,可以用来设置小数点的符号。比如说,
In [36]: !cat file.ssv
0; 0,28321815; 0,5819178
1; 0,56868281; 0,85621369
2; 0,24022026; 0,53490058
3; 0,63641921; 0,0293904
4; 0,65585546; 0,55913776
In [37]: import pandas as pd
In [38]: df = pd.read_csv("file.ssv", delimiter=';', decimal=',', header=None)
In [39]: df
Out[39]:
0 1 2
0 0 0.283218 0.581918
1 1 0.568683 0.856214
2 2 0.240220 0.534901
3 3 0.636419 0.029390
4 4 0.655855 0.559138
[5 rows x 3 columns]
这样你就可以利用pandas的强大功能来处理这些数据了。或者你也可以把数据框转换成numpy数组:
In [51]: df.as_matrix()
Out[51]:
array([[ 0. , 0.28321815, 0.5819178 ],
[ 1. , 0.56868281, 0.85621369],
[ 2. , 0.24022026, 0.53490058],
[ 3. , 0.63641921, 0.0293904 ],
[ 4. , 0.65585546, 0.55913776]])
7
因为 genfromtxt()
可以接受一个迭代器,所以你可以传入一个应用了你转换函数的迭代器,这样就可以省去使用转换器参数了:
import numpy as np
def conv(x):
return x.replace(',', '.').encode()
data = np.genfromtxt((conv(x) for x in open("test.txt")), delimiter=';')