numpy genfromtxt 转换器未知列数

3 投票
2 回答
6292 浏览
提问于 2025-04-18 02:05

我有几个数据文件,里面的数字小数点是用逗号来表示的。所以我用一个叫做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=';')

撰写回答