NumPy genfromtxt转换器未知列数

3

我有几个数据数字文件,其中小数点分隔符是逗号。因此,我使用一个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中指定文件中的列数,它会读取所有的列数。即使使用转换器选项,我也希望保留此功能。


nb_cols 出现了一个 NameError,应该是 num_cols(对不起,我不能编辑两个字符,呃!) - Ghanima
2个回答

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=';')

numpy.genfromtxt可以打开gz或bz2文件;我该如何使用您的解决方案添加此功能? - user1850133
@user1850133,你可以使用相同的方法,将open()替换为gzip.open()如此线程中所解释的 - Saullo G. P. Castro
1
相反,我创建了一个z_open()函数来打开gz或bz2文件,或者如果给定的文件未压缩,则仅返回open()的输出。 - user1850133
这似乎在Py3中无法工作,因为x不再是一个字符串,而是一个字节字符串,因此替换操作不能直接在其上进行,需要先解码。 - Ghanima
@Ghanima 谢谢你的更新。在 Python 3.5 中测试后,我刚刚编辑了答案。 - Saullo G. P. Castro

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]

然后,您可以利用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]])

看起来很有趣,但我需要安装它。 - user1850133

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接