您在定义 dtype 方面是正确的。您只是缺少字段形状。
我会演示:
“文本”文件 - 行列表(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()
一个 dtype 有 2 个字段,一个带有字符串,另一个带有浮点数(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 可以用字典语法指定,但我更熟悉元组列表形式。
等效的数据类型规范:
np.dtype("U10, (3,)f")
np.dtype({'names':['label','values'], 'formats':['S10','(3,)f']})
np.genfromtxt(txt,delimiter=',',dtype='S10,(3,)f')
=================================
我认为这个 txt,如果用 dtype=None 解析会产生
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')])
可以转换为子字段形式
y.view(dt)
只要底层数据表示(被视为字节的平面列表)兼容(此处为 10 个 unicode 字符(40 个字节)和 3 个浮点数,每条记录),它就可以工作。