我有一个从这样的文件中读取的示例numpy数组:
import numpy as np
data = np.array([(b'M', 119., 76.), (b'M', 114., 73.), (b'F', 124., 79.)],
dtype=[('gender', 'S1'), ('bps', '<f8'), ('bpd', '<f8')])
如何获得第一列gender
?
我尝试过:
gender = data[:,0] # fails
gender = [i[0] for i in data] # pass
是否有更简单的方法来获取没有列表理解的第一列?
我们可以解压缩g,b,p = * data等3列吗?
答案 0 :(得分:2)
您制作了一维结构化数组(带有复合dtype
):
In [717]: data = np.array([(b'M', 119., 76.), (b'M', 114., 73.), (b'F', 124.,
...: 79.)],
...: dtype=[('gender', 'S1'), ('bps', '<f8'), ('bpd', '<f8')])
In [718]:
In [718]: data.shape
Out[718]: (3,)
In [719]: data.dtype.fields
Out[719]:
mappingproxy({'gender': (dtype('S1'), 0),
'bps': (dtype('float64'), 1),
'bpd': (dtype('float64'), 9)})
fields
是通过名称而不是列号访问的:
In [720]: data['gender']
Out[720]: array([b'M', b'M', b'F'], dtype='|S1')
此数组的元素为:
In [721]: data[0]
Out[721]: (b'M', 119., 76.)
In [722]: type(_)
Out[722]: numpy.void
我们称其为record
,但它确实显示(和索引)为元组。请注意,您的创建表达式使用元组列表。
解压缩数组的一种方法是遍历字段名称:
In [734]: data.dtype.names
Out[734]: ('gender', 'bps', 'bpd')
In [735]: a,b,c = [data[name] for name in data.dtype.names]
In [736]: a
Out[736]: array([b'M', b'M', b'F'], dtype='|S1')
In [737]: b
Out[737]: array([119., 114., 124.])
In [738]: c
Out[738]: array([76., 73., 79.])
答案 1 :(得分:1)
首先,您的data
没有列。这只是一维数组。
data.shape
(3, )
因此,当您通过2d索引时,切片将提高IndexError
。
尝试:
list(zip(*data))[0]
# (b'M', b'M', b'F')
答案 2 :(得分:1)
这不是ndarray,您有array(tuple,tuple,tuple)
data.shape
(3,)
将其转换为ndarray
,然后可以使用列和索引进行切片
np.array(data.tolist())[:,0]
array([b'M', b'M', b'F'], dtype='|S5')
更多信息:
np.array(data.tolist()).shape
(3, 3)