numpy.genfromtxt从名称/键中删除冒号

时间:2017-08-23 03:32:35

标签: python csv numpy

我使用numpy的np.genfromtxt(FileName,delimiter=",",names=True)将csv文件导入numpy数组。一切似乎都运行良好,除了我的标题名称带冒号(例如Points:1),但numpy为没有冒号的数据列设置了键(例如Points1)。

为什么会发生这种情况,有没有办法阻止它?

MWE

min.csv:

"Time", "Points:0", "Points:1"
0.0, 1.0, 2.0
3.0,4.0,5.0

脚本:

import numpy as np
data = np.genfromtxt("min.csv",delimiter=",",names=True)
print data
print data.dtype

输出:

[( 0.,  1.,  2.) ( 3.,  4.,  5.)]
[('Time', '<f8'), ('Points0', '<f8'), ('Points1', '<f8')]

2 个答案:

答案 0 :(得分:4)

来自'验证名称'下的numpy文档:

  

deletechars给出一个字符串,组合所有必须的字符   从名称中删除。默认情况下,无效字符是   ~!@#$%^&*()-=+~\|]}[{';: /?.>,<

所以您需要做的就是添加自己的deletechars值。在下面的示例中,我只是从文档中复制了字符串并删除了冒号:

import numpy as np
data = np.genfromtxt(
    "min.csv",delimiter=",",names=True,
    deletechars="~!@#$%^&*()-=+~\|]}[{'; /?.>,<",
)
print data
print data.dtype

结果如下:

[( 0.,  1.,  2.) ( 3.,  4.,  5.)]
[('Time', '<f8'), ('Points:0', '<f8'), ('Points:1', '<f8')]

答案 1 :(得分:2)

您需要使用deletechars参数来控制从名称中删除的内容。通常,名称被“清理”,因此它们将作为recarray名称(即作为有效的Python变量/属性名称)。在过去,我发现dtype=None也需要这项工作(现在可能会更正)。

Numpy.genfromtxt deleting square brackets in dtype.names

In [1137]: txt = b""""Time", "Points:0", "Points:1"
      ...: 0.0, 1.0, 2.0
      ...: 3.0,4.0,5.0"""
In [1141]: np.genfromtxt(txt.splitlines(),delimiter=',',names=True,deletechars='',dtype=None)
Out[1141]: 
array([( 0.,  1.,  2.), ( 3.,  4.,  5.)],
      dtype=[('Time', '<f8'), ('Points:0', '<f8'), ('Points:1', '<f8')])