Python 使用numpy loadtxt函数从文本文件读取值

Python 使用numpy loadtxt函数从文本文件读取值,python,arrays,numpy,Python,Arrays,Numpy,我有一份与此表格相关的文件: label1, value1, value2, value3, label2, value1, value2, value3, ... 我想使用numpy loadtxt函数读取它,这样我就可以将每个标签及其值放在一个数组中,因此最终结果将是一个数组数组,其中每个数组都包括标签和一个如下所示的功能数组: array([[label1, [value1, value2, value3]], [label2, [value1, value2, value

我有一份与此表格相关的文件:

label1, value1, value2, value3,
label2, value1, value2, value3,
...
我想使用numpy loadtxt函数读取它,这样我就可以将每个标签及其值放在一个数组中,因此最终结果将是一个数组数组,其中每个数组都包括标签和一个如下所示的功能数组:

array([[label1, [value1, value2, value3]],
       [label2, [value1, value2, value3]]])
我尝试了以下方法,但无效:

c = StringIO(u"text.txt")
np.loadtxt(c,
   dtype={'samples': ('label', 'features'), 'formats': ('s9',np.float)},
   delimiter=',', skiprows=0)

有什么想法吗?

最现代、最通用的方法是使用pandas,pandas的解析器有更多的选项和管理标签

假设您的文件包含:

A,7,5,1
B,4,2,7
然后:

In [29]: import pandas as pd
In [30]: df=pd.read_csv('data.csv',sep=',',header=None,index_col=0)

In [31]: df
Out[31]: 
   1  2  3
0         
A  7  5  1
B  4  2  7
现在,您可以在结构数组中轻松转换它:

In [32]: a=df.T.to_records(index=False)
Out[32]: 
rec.array([(7, 4), (5, 2), (1, 7)], 
          dtype=[('A', '<i8'), ('B', '<i8')])

In [33]: a['A']
Out[33]: array([7, 5, 1], dtype=int64)

使用loadtext,您必须手动执行许多低级操作。

最现代、最通用的方法是使用pandas,pandas的解析器具有更多选项并管理标签

假设您的文件包含:

A,7,5,1
B,4,2,7
然后:

In [29]: import pandas as pd
In [30]: df=pd.read_csv('data.csv',sep=',',header=None,index_col=0)

In [31]: df
Out[31]: 
   1  2  3
0         
A  7  5  1
B  4  2  7
现在,您可以在结构数组中轻松转换它:

In [32]: a=df.T.to_records(index=False)
Out[32]: 
rec.array([(7, 4), (5, 2), (1, 7)], 
          dtype=[('A', '<i8'), ('B', '<i8')])

In [33]: a['A']
Out[33]: array([7, 5, 1], dtype=int64)

使用loadtext,您将不得不手动执行许多低级操作。

定义数据类型是正确的。您只是缺少字段形状

我将演示:

“文本”文件-Py3中的行字节列表:

In [95]: txt=b"""label1, 12, 23.2, 232
   ....: label2, 23, 2324, 324
   ....: label3, 34, 123, 2141
   ....: label4, 0, 2, 3
   ....: """

In [96]: txt=txt.splitlines()
具有两个字段的数据类型,一个带有字符串,另一个带有浮点数3表示“字段形状”:

In [98]: dt=np.dtype([('label','U10'),('values', 'float',(3))])

In [99]: data=np.genfromtxt(txt,delimiter=',',dtype=dt)

In [100]: data
Out[100]: 
array([('label1', [12.0, 23.2, 232.0]), ('label2', [23.0, 2324.0, 324.0]),
       ('label3', [34.0, 123.0, 2141.0]), ('label4', [0.0, 2.0, 3.0])], 
      dtype=[('label', '<U10'), ('values', '<f8', (3,))])

In [101]: data['label']
Out[101]: 
array(['label1', 'label2', 'label3', 'label4'], 
      dtype='<U10')

In [103]: data['values']
Out[103]: 
array([[  1.20000000e+01,   2.32000000e+01,   2.32000000e+02],
       [  2.30000000e+01,   2.32400000e+03,   3.24000000e+02],
       [  3.40000000e+01,   1.23000000e+02,   2.14100000e+03],
       [  0.00000000e+00,   2.00000000e+00,   3.00000000e+00]])
===============================

我认为,如果用dtype=None解析这个txt,将产生

In [30]: y
Out[30]: 
array([('label1', 12.0, 23.2, 232.0), ('label2', 23.0, 2324.0, 324.0),
       ('label3', 34.0, 123.0, 2141.0), ('label4', 0.0, 2.0, 3.0)], 
      dtype=[('f0', '<U10'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')])

只要被视为字节平面列表的基础数据表示在这里是兼容的,每个记录有10个unicode字符40个字节和3个浮点。

定义数据类型的方法是正确的。您只是缺少字段形状

我将演示:

“文本”文件-Py3中的行字节列表:

In [95]: txt=b"""label1, 12, 23.2, 232
   ....: label2, 23, 2324, 324
   ....: label3, 34, 123, 2141
   ....: label4, 0, 2, 3
   ....: """

In [96]: txt=txt.splitlines()
具有两个字段的数据类型,一个带有字符串,另一个带有浮点数3表示“字段形状”:

In [98]: dt=np.dtype([('label','U10'),('values', 'float',(3))])

In [99]: data=np.genfromtxt(txt,delimiter=',',dtype=dt)

In [100]: data
Out[100]: 
array([('label1', [12.0, 23.2, 232.0]), ('label2', [23.0, 2324.0, 324.0]),
       ('label3', [34.0, 123.0, 2141.0]), ('label4', [0.0, 2.0, 3.0])], 
      dtype=[('label', '<U10'), ('values', '<f8', (3,))])

In [101]: data['label']
Out[101]: 
array(['label1', 'label2', 'label3', 'label4'], 
      dtype='<U10')

In [103]: data['values']
Out[103]: 
array([[  1.20000000e+01,   2.32000000e+01,   2.32000000e+02],
       [  2.30000000e+01,   2.32400000e+03,   3.24000000e+02],
       [  3.40000000e+01,   1.23000000e+02,   2.14100000e+03],
       [  0.00000000e+00,   2.00000000e+00,   3.00000000e+00]])
===============================

我认为,如果用dtype=None解析这个txt,将产生

In [30]: y
Out[30]: 
array([('label1', 12.0, 23.2, 232.0), ('label2', 23.0, 2324.0, 324.0),
       ('label3', 34.0, 123.0, 2141.0), ('label4', 0.0, 2.0, 3.0)], 
      dtype=[('f0', '<U10'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')])

只要被视为字节平面列表的底层数据表示在这里是兼容的,每个记录10个unicode字符40个字节,3个浮点。

这对我来说非常有用,但我得到的错误是元组大小必须与字段数匹配。我的实际txt文件与发布的示例相同,但是,有一个标签和22个其他值,因此我的代码是txt=StringIOudataset.txt dt=np.dtype['label','U10','features','float',22]data=np.genfromtxttxt,delimiter=','dtype=dtYes,已命名或子数组中的总数字段需要与文件中的列数相匹配,或者在usecols参数中。是的,我注意到,但是,我不知道为什么它不起作用,并向我显示了该错误。请尝试使用dtype=None来查看它从数据中推断出的数据类型。这可能会帮助你纠正你的定义。在一定范围内,您甚至可以使用astype或view将该数据类型转换为您的数据类型。这对我非常有用,但我得到一个错误,即tuple的大小必须与字段数匹配。我的实际txt文件与发布的示例相同,但是,有一个标签和22个其他值,因此我的代码是txt=StringIOudataset.txt dt=np.dtype['label','U10','features','float',22]data=np.genfromtxttxt,delimiter=','dtype=dtYes,已命名或子数组中的总数字段需要与文件中的列数相匹配,或者在usecols参数中。是的,我注意到,但是,我不知道为什么它不起作用,并向我显示了该错误。请尝试使用dtype=None来查看它从数据中推断出的数据类型。这可能会帮助你纠正你的定义。在一定范围内,您甚至可以使用astype或view将该数据类型转换为您的数据类型。