Извлечение определенных столбцов в массиве numpy


164

Это простой вопрос, но, скажем, у меня есть матрица MxN. Все, что я хочу сделать, это извлечь определенные столбцы и сохранить их в другом массиве, но я получаю неверные синтаксические ошибки. Вот код:

extractedData = data[[:,1],[:,9]]. 

Кажется, что приведенной выше строки должно быть достаточно, но я думаю, что нет. Я огляделся, но не смог найти ничего разумного в отношении этого конкретного сценария.

Ответы:


272

Я полагаю, вы хотели столбцы 1и 9? Это

data[:, [1, 9]]

Или с именами:

data[:, ['Column Name1','Column Name2']]

Вы можете получить имена от data.dtype.names...


Как это сделать с именами столбцов?
Зельфир Кальцталь

9
data [:, ['Column Name1', 'Column Name2']]
code-assassin

это вид или копия? мое узкое место находится на этой линии, я ищу способ оптимизировать
Fractale

1
Может ли быть так, что эта функция больше не работает?
PV8

Как называется этот синтаксис?
Буррито

29

Предполагая, что вы хотите получить столбцы 1 и 9 с этим фрагментом кода, это должно быть:

extractedData = data[:,[1,9]]

14

если вы хотите извлечь только несколько столбцов:

idx_IN_columns = [1, 9]
extractedData = data[:,idx_IN_columns]

если вы хотите исключить определенные столбцы:

idx_OUT_columns = [1, 9]
idx_IN_columns = [i for i in xrange(np.shape(data)[1]) if i not in idx_OUT_columns]
extractedData = data[:,idx_IN_columns]

9

Я хотел бы отметить одну вещь: если число столбцов, которое вы хотите извлечь, равно 1, полученная матрица будет не матрицей Mx1, как вы могли бы ожидать, а массивом, содержащим элементы извлеченного столбца.

Чтобы преобразовать его в Matrix, в результирующем массиве следует использовать метод reshape (M, 1) .


2
Также вы можете добиться этого, используя, например, двоеточие data[:, 8:9]. Это занимает восемь столбцов, но не удаляет дополнительное измерение.
Ян Кукацка

data [:, 8] также выберет 8-й столбец и вернет матрицу
Mx1

5

Просто:

>>> m = np.matrix(np.random.random((5, 5)))
>>> m
matrix([[0.91074101, 0.65999332, 0.69774588, 0.007355  , 0.33025395],
        [0.11078742, 0.67463754, 0.43158254, 0.95367876, 0.85926405],
        [0.98665185, 0.86431513, 0.12153138, 0.73006437, 0.13404811],
        [0.24602225, 0.66139215, 0.08400288, 0.56769924, 0.47974697],
        [0.25345299, 0.76385882, 0.11002419, 0.2509888 , 0.06312359]])
>>> m[:,[1, 2]]
matrix([[0.65999332, 0.69774588],
        [0.67463754, 0.43158254],
        [0.86431513, 0.12153138],
        [0.66139215, 0.08400288],
        [0.76385882, 0.11002419]])

Столбцы не обязательно должны быть в порядке:

>>> m[:,[2, 1, 3]]
matrix([[0.69774588, 0.65999332, 0.007355  ],
        [0.43158254, 0.67463754, 0.95367876],
        [0.12153138, 0.86431513, 0.73006437],
        [0.08400288, 0.66139215, 0.56769924],
        [0.11002419, 0.76385882, 0.2509888 ]])

2

Еще одна вещь, на которую следует обратить внимание при выборе столбцов из массива ND с помощью такого списка:

data[:,:,[1,9]]

Если вы удаляете измерение (например, выбрав только одну строку), результирующий массив будет (по некоторым причинам) переставлен . Так:

print data.shape            # gives [10,20,30]
selection = data[1,:,[1,9]]
print selection.shape       # gives [2,20] instead of [20,2]!!

1

Ты можешь использовать :

extracted_data = data.ix[:,['Column1','Column2']]


2
Хороший ответ всегда будет содержать объяснение того, что было сделано и почему это было сделано таким образом, не только для ФП, но и для будущих посетителей SO. Пожалуйста, добавьте описание, чтобы другие поняли.
Руча Бхатт Джоши

-1

Я думаю, что решение здесь не работает с обновлением версии Python, один из способов сделать это с помощью новой функции Python:

extracted_data = data[['Column Name1','Column Name2']].to_numpy()

который дает вам желаемый результат.

Документацию вы можете найти здесь: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html#pandas.DataFrame.to_numpy


вопрос начинается с пустого массива, а не с
фрейма данных

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.