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.

Aladdin
źródło

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

Fred Foo
źródło
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]]
Michael J. Barber
źródło
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]
queise
źródło
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.

Daksh
źródło
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 ]])
yanhh
źródło
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]!!
Jan Kukacka
źródło
1

Możesz użyć :

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

Rahul
źródło
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
-1

Myślę, że rozwiązanie tutaj nie działa już z aktualizacją wersji Pythona, jednym ze sposobów na zrobienie tego z nową funkcją Pythona jest:

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

co daje pożądany efekt.

Dokumentację można znaleźć tutaj: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html#pandas.DataFrame.to_numpy

PV8
źródło
pytanie zaczyna się od tablicy numpy, a nie ramki danych
TMrtSmith
-3

możesz również użyć extractData = data ([:, 1], [:, 9])

Pranav Mahajan
źródło