我有几个数据数字文件,其中小数点分隔符是逗号。所以我使用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
文件中的列数,而是需要它找到的所有列。即使使用转换器选项,我也希望保留此功能。
答案 0 :(得分: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=';')
答案 1 :(得分:2)
使用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]])