【问题标题】:numpy genfromtxt converters unknown number of columnsnumpy genfromtxt 转换器未知的列数
【发布时间】:2014-05-23 03:29:23
【问题描述】:

我有几个数据数字文件,其中小数点分隔符是逗号。所以我用一个 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 文件中的列数,它会占用它找到的所有内容。即使使用转换器选项,我也想保留此功能。

【问题讨论】:

  • 有一个NameErrornb_cols,应该是num_cols(抱歉,我不能编辑两个字符,嗯!)

标签: python file-io numpy converter genfromtxt


【解决方案1】:

由于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 您可以使用相同的方法将open() 替换为gzip.open(), as explained in this thread
  • 相反,我创建了一个 z_open() 函数来打开 gz 或 bz2 文件,或者如果给定文件未压缩,则只返回 open() 的输出。
  • 这似乎不起作用(在 Py3 中),因为 x 不再是字符串而是字节字符串,因此如果不先对其进行解码,replace 就不会对其进行操作。
  • @Ghanima 感谢您的更新。我刚刚在 Python 3.5 中测试后编辑了答案
【解决方案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]])

【讨论】:

  • 看起来很有趣,但我需要安装它。
猜你喜欢
  • 2019-04-08
  • 2013-03-28
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
  • 2015-11-22
  • 2016-01-18
相关资源
最近更新 更多