NumPy切片给IndexError:数组索引过多

时间:2019-01-23 01:42:32

标签: python numpy

我有一个从这样的文件中读取的示例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列吗?

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)