2017-09-17 82 views
6

Załóżmy, że mam następujący numpy wektorWyodrębnianie i przekształcania danych w numpy

[[1, 3., 'John Doe', 'male', 'doc', '25'], 
    ..., 
[9, 6., 'Jane Doe', 'female', 'p', '28']] 

muszę wyodrębnić istotne dla moich danych konkurencji.

Jako nowicjusz w numpy i python w ogóle, chciałbym zrobić to w następujący sposób:

data = np.array(
[[1, 3., 'John Doe', 'male', 'doc', 25], 
[9, 6., 'Jane Doe', 'female', 'p', 28]] 
) 

data_tr = np.zeros((data.shape[0], 3)) 
for i in range(0, data.shape[0]): 
    data_tr[i][0] = data[i, 1] 
    data_tr[i][1] = 0 if data[i, 3] == 'male' else 1 
    data_tr[i][2] = data[i, 5] 

I w rezultacie mam następujący:

[[ 3., 0., 25.], 
[ 6., 1., 28.]] 

Co chciałbym wiedzieć, czy istnieje bardziej wydajny lub czystszy sposób wykonania tego.
Czy ktokolwiek może mi w tym pomóc?

+1

Kilka uwag - 'np.array' jest przylegająca obiektu, oznacza to, że każdy element musi być ten sam typ, więc wynik 'danych' jest już listą ciągów znaków, ponieważ nie można przekazać łańcuchów" męskich "i innych do typu numerica. Lepiej używać list. – Chinny84

+0

Spójrz na 'dane'. Jest to tablica łańcuchów (2,6), a nie liczb mieszanych i łańcuchów. "data_tr" z drugiej strony jest domyślnym 'float' dtype. Podczas przypisywania z 'data' do' data_tr' 'numpy' próbuje przekonwertować ciąg na float. W tym przypadku działa. Ale jeśli źle ustawisz kolumny, może to spowodować błąd. – hpaulj

Odpowiedz

5

Jedno podejście z column-indexing -

data_tr = np.zeros((data.shape[0], 3)) 
data_tr[:,[0,2]] = data[:, [1,5]] 
data_tr[:,1] = data[:,3]=='male' 

Uwaga że etap: data_tr[:,[0,2]] = data[:, [1,5]] pracuje poza kopiami odpowiednich kolumnach. Nie są one bardzo wydajne przy przydzielaniu i ekstrakcji. Więc może chcesz to zrobić w dwóch oddzielnych etapach, głównie pod kątem wydajności, jak tak -

data_tr[:,0] = data[:, 1] 
data_tr[:,2] = data[:, 5] 
+1

ponownie czytając komentarz wydaje się, że faktycznie omawiasz tylko część "algorytmu". Chociaż powinieneś wskazać użytkownikowi listy na pierwszy bit. +1 – Chinny84

+1

@ Chinny84 Nie znam źródła danych wejściowych. Dlatego nie jestem w stanie wyrazić zgody lub nie wyrazić zgody na dane wejściowe. Jako odbierający zaczynam od danych wejściowych i próbuję dostać się do pożądanego wyjścia. Nie jestem pewien, czy odpowiada na twoje wątpliwości, ale mam nadzieję, że tak. – Divakar

+0

Witaj, Divakar! Dzięki za odpowiedź, na pewno tego szukałem! Podczas gdy główna część z pewnością została odebrana, chciałem zapytać o najlepsze praktyki dotyczące takich danych jak moja. Jak zauważyłem @ Chinny84 (i jak podejrzewałem), definitywnie używam nie podejścia "bes". –