Витяг конкретних стовпців з масивного масиву


164

Це просте запитання, але скажіть, у мене є матриця MxN. Все, що я хочу зробити, - це витягнути конкретні стовпці та зберігати їх в іншому масивному масиві, але я отримую невірні синтаксичні помилки. Ось код:

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

Здається, що вищезазначеного рядка має бути достатньо, але я думаю, що ні. Я озирнувся, але не зміг знайти синтаксису, що стосується цього конкретного сценарію.

Відповіді:


272

Я припускаю, що ви хотіли колонки 1і 9? Ось так

data[:, [1, 9]]

Або з іменами:

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

Імена ви можете отримати від data.dtype.names


Як це зробити з іменами стовпців?
Зельфір Кальтшталь

9
data [:, ['Назва стовпця1', 'Назва стовпця2']]
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 слід використовувати метод переформатування (M, 1) на отриманому масиві.


2
Також ви можете досягти цього, наприклад, використовуючи двокрапку data[:, 8:9]. Це займає вісім стовпців, але не видаляє зайвий вимір.
Ян Кукацька

дані [:, 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
Хороша відповідь завжди матиме пояснення того, що було зроблено і чому це було зроблено таким чином, не тільки для ОП, але і для майбутніх відвідувачів ДП. Додайте опис, щоб інші зрозуміли.
Rucha Bhatt Joshi

-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


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.