我有几个数据数字文件,其中的十进制分隔符是逗号。因此,我使用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
文件中的列数,它会获取它所找到的所有列数。即使使用转换器选项,我也希望保留此功能。
由于genfromtxt()
接受迭代器,您可以通过应用转换函数的迭代器来传递,然后可以避免转换器参数:
import numpy as np
def conv(x):
return x.replace(',', '.').encode()
data = np.genfromtxt((conv(x) for x in open("test.txt")), delimiter=';')
使用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]
然后,你就拥有了熊猫般的善良,可以用来操纵这些数据。或者,您可以将数据帧转换为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]])