Нарезка NumPy дает IndexError: слишком много индексов для массива - PullRequest
0 голосов
/ 23 января 2019

У меня есть пример массива 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

Есть ли более простой способ получить первый столбец без понимания списка?

Можем ли мы распаковать 3 столбца, такие как g, b, p = * data?

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Это не 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)
0 голосов
/ 23 января 2019

Вы создали 1d структурированный массив (с составным 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.])
0 голосов
/ 23 января 2019

Прежде всего, ваш data не имеет столбца .Это всего лишь 1-мерный массив.

data.shape
(3, )

Таким образом, срезы увеличатся на IndexError при передаче двухмерных индексов.

Попробуйте:

list(zip(*data))[0]
# (b'M', b'M', b'F')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...