Estrazione di colonne specifiche nell'array numpy


164

Questa è una domanda facile ma dire che ho una matrice MxN. Tutto quello che voglio fare è estrarre colonne specifiche e archiviarle in un altro array numpy ma ottengo errori di sintassi non validi. Ecco il codice:

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

Sembra che la riga sopra dovrebbe essere sufficiente, ma credo di no. Mi sono guardato intorno ma non sono riuscito a trovare alcuna sintassi saggia in questo specifico scenario.

Risposte:


272

Presumo tu volessi le colonne 1e 9? Quello è

data[:, [1, 9]]

O con nomi:

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

Puoi ottenere i nomi da data.dtype.names...


Come farlo con i nomi delle colonne?
Zelphir Kaltstahl,

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

è una vista o una copia? il mio collo di bottiglia è su questa linea cerco il modo di ottimizzare
Fractale

1
potrebbe essere che questa funzione non funzioni più?
PV8,

Come si chiama questa sintassi?
Burrito,

29

Supponendo che tu voglia ottenere le colonne 1 e 9 con quel frammento di codice, dovrebbe essere:

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

14

se vuoi estrarre solo alcune colonne:

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

se si desidera escludere colonne specifiche:

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

Una cosa che vorrei sottolineare è che, se il numero di colonne che si desidera estrarre è 1, la matrice risultante non sarebbe una matrice Mx1 come ci si potrebbe aspettare ma invece un array contenente gli elementi della colonna che è stata estratta.

Per convertirlo in Matrix , è necessario utilizzare il metodo reshape (M, 1) sull'array risultante.


2
Inoltre, puoi ottenere ciò utilizzando i due punti, ad esempio data[:, 8:9]. Questo richiede l'ottava colonna ma non rimuove la dimensione aggiuntiva.
Jan Kukacka,

data [:, 8] sceglierà anche l'ottava colonna e restituirà una Mx1 Matrix
StefanMK

5

Appena:

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

Le colonne non devono essere in ordine:

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

Un'altra cosa a cui dovresti prestare attenzione quando selezioni le colonne dall'array ND usando un elenco come questo:

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

Se si rimuove una dimensione (selezionando solo una riga, ad esempio), l'array risultante sarà (per qualche motivo) consentito . Così:

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

1

Puoi usare :

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


2
Una buona risposta avrà sempre una spiegazione di ciò che è stato fatto e del perché è stato fatto in questo modo, non solo per l'OP ma anche per i futuri visitatori di SO. Aggiungi una descrizione per far capire agli altri.
Rucha Bhatt Joshi,

-1

Penso che la soluzione qui non funzioni più con un aggiornamento della versione di Python, un modo per farlo con una nuova funzione Python perché è:

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

che ti dà il risultato desiderato.

La documentazione che puoi trovare qui: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html#pandas.DataFrame.to_numpy


la domanda inizia con una matrice numpy, non con un frame di dati
TMrtSmith

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.