Wyodrębnianie określonych kolumn w tablicy numpy


164

To łatwe pytanie, ale powiedz, że mam macierz MxN. Chcę tylko wyodrębnić określone kolumny i zapisać je w innej tablicy numpy, ale otrzymuję nieprawidłowe błędy składniowe. Oto kod:

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

Wygląda na to, że powyższa linia powinna wystarczyć, ale chyba nie. Rozejrzałem się, ale nie mogłem znaleźć nic rozsądnego pod względem składni w odniesieniu do tego konkretnego scenariusza.

Odpowiedzi:


272

Zakładam, że chciałeś kolumn 1i 9? To jest

data[:, [1, 9]]

Lub z imionami:

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

Możesz pobrać imiona z data.dtype.names


Jak to zrobić z nazwami kolumn?
Zelphir Kaltstahl

9
data [:, ['Nazwa kolumny1', 'Nazwa kolumny2']]
zabójca kodu

czy to widok czy kopia? moje wąskie gardło jest na tej linii, szukam sposobu na optymalizację
Fractale

1
czy to możliwe, że ta funkcja już nie działa?
PV8

Jak nazywa się ta składnia?
Burrito

29

Zakładając, że chcesz uzyskać kolumny 1 i 9 z tym fragmentem kodu, powinno to być:

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

14

jeśli chcesz wyodrębnić tylko niektóre kolumny:

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

jeśli chcesz wykluczyć określone kolumny:

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

Jedną rzeczą, na którą chciałbym zwrócić uwagę, jest to, że jeśli liczba kolumn, które chcesz wyodrębnić, wynosi 1, wynikowa macierz nie byłaby macierzą Mx1, jak można się spodziewać, ale zamiast tego tablicą zawierającą elementy wyodrębnionej kolumny.

Aby przekonwertować go na Matrix , należy zastosować metodę reshape (M, 1) na wynikowej tablicy.


2
Możesz to również osiągnąć, na przykład używając dwukropka data[:, 8:9]. To zajmuje osiem kolumn, ale nie usuwa dodatkowego wymiaru.
Jan Kukacka

data [:, 8] również wybierze 8. kolumnę i zwróci Mx1 Matrix
StefanMK

5

Właśnie:

>>> 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]])

Kolumny nie muszą być w kolejności:

>>> 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

Jeszcze jedna rzecz, na którą należy zwrócić uwagę przy wyborze kolumn z tablicy ND za pomocą takiej listy:

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

Jeśli usuwasz wymiar (na przykład wybierając tylko jeden wiersz), wynikowa tablica zostanie (z jakiegoś powodu) permutowana . Więc:

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

1

Możesz użyć :

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


2
Dobra odpowiedź będzie zawsze zawierała wyjaśnienie, co zostało zrobione i dlaczego zostało to zrobione w taki sposób, nie tylko dla PO, ale dla przyszłych gości SO. Dodaj opis, aby inni zrozumieli.
Rucha Bhatt Joshi


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.