当第一列是字符串而其余列是数字时,如何使用numpy.genfromtxt?

Jim*_*Jim 54 python numpy

基本上,我有一堆数据,其中第一列是字符串(标签),其余列是数值.我执行以下操作:

data = numpy.genfromtxt('data.txt', delimiter = ',')
Run Code Online (Sandbox Code Playgroud)

这很好地读取了大部分数据,但标签列只是'nan'.我怎么处理这个?

Pie*_* GM 60

默认情况下,np.genfromtxt使用dtype=float:这就是你将字符串列转换为NaN的原因,因为毕竟它们不是一个数字......

您可以np.genfromtxt通过使用dtype=None以下方法尝试猜测列的实际类型:

>>> from StringIO import StringIO
>>> test = "a,1,2\nb,3,4"
>>> a = np.genfromtxt(StringIO(test), delimiter=",", dtype=None)
>>> print a
array([('a',1,2),('b',3,4)], dtype=[('f0', '|S1'),('f1', '<i8'),('f2', '<i8')])
Run Code Online (Sandbox Code Playgroud)

您可以使用他们的名称访问列,例如a['f0']......

dtype=None如果您不知道列应该是什么,使用是一个很好的技巧.如果您已经知道它们应该具有哪种类型,您可以明确说明dtype.例如,在我们的测试中,我们知道第一列是一个字符串,第二列是一个int,我们希望第三列是一个浮点数.然后我们会用

>>> np.genfromtxt(StringIO(test), delimiter=",", dtype=("|S10", int, float))
array([('a', 1, 2.0), ('b', 3, 4.0)], 
      dtype=[('f0', '|S10'), ('f1', '<i8'), ('f2', '<f8')])
Run Code Online (Sandbox Code Playgroud)

使用显式dtype比使用更有效,dtype=None并且是推荐的方式.

在这两种情况下(dtype=None或显式,非同类dtype),您最终得到一个结构化数组.

[注意:使用dtype=None,输入被第二次解析,并且每列的类型被更新以匹配可能的更大类型:首先我们尝试bool,然后是int,然后是float,然后是复数,然后我们保持一个字符串如果一切都失败了.实际上,实施相当笨重.有一些尝试使类型猜测更有效(使用正则表达式),但到目前为止没有任何东西]


fel*_*ian 30

如果您的数据文件结构如下

col1, col2, col3
   1,    2,    3
  10,   20,   30
 100,  200,  300
Run Code Online (Sandbox Code Playgroud)

然后numpy.genfromtxt可以使用该names=True选项将第一行解释为列标题.有了这个,您可以通过提供列标题非常方便地访问数据:

data = np.genfromtxt('data.txt', delimiter=',', names=True)
print data['col1']    # array([   1.,   10.,  100.])
print data['col2']    # array([   2.,   20.,  200.])
print data['col3']    # array([   3.,   30.,  300.])
Run Code Online (Sandbox Code Playgroud)

因为在您的情况下数据是这样形成的

row1,   1,  10, 100
row2,   2,  20, 200
row3,   3,  30, 300
Run Code Online (Sandbox Code Playgroud)

您可以使用以下代码段实现类似的功能:

labels = np.genfromtxt('data.txt', delimiter=',', usecols=0, dtype=str)
raw_data = np.genfromtxt('data.txt', delimiter=',')[:,1:]
data = {label: row for label, row in zip(labels, raw_data)}
Run Code Online (Sandbox Code Playgroud)

第一行将第一列(标签)读入字符串数组.第二行读取文件中的所有数据,但丢弃第一列.第三行使用字典理解来创建一个字典,它可以像numpy.genfromtxt使用names=True选项创建的结构化数组一样使用:

print data['row1']    # array([   1.,   10.,  100.])
print data['row2']    # array([   2.,   20.,  200.])
print data['row3']    # array([   3.,   30.,  300.])
Run Code Online (Sandbox Code Playgroud)


小智 7

data=np.genfromtxt(csv_file, delimiter=',', dtype='unicode')

这对我来说可以.