Extraer columnas específicas en una matriz numpy

164

Esta es una pregunta fácil, pero digamos que tengo una matriz MxN. Todo lo que quiero hacer es extraer columnas específicas y almacenarlas en otra matriz numpy, pero obtengo errores de sintaxis no válidos. Aquí está el código:

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

Parece que la línea anterior debería ser suficiente, pero supongo que no. Miré a mi alrededor pero no pude encontrar nada de sintaxis con respecto a este escenario específico.

Aladino
fuente

Respuestas:

272

Supongo que querías columnas 1y 9? Eso es

data[:, [1, 9]]

O con nombres:

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

Puedes obtener los nombres de data.dtype.names...

Fred Foo
fuente
¿Cómo hacer eso con los nombres de columna?
Zelphir Kaltstahl el
9
data [:, ['Column Name1', 'Column Name2']]
code-assassin
¿Es una vista o una copia? mi cuello de botella está en esta línea, busco la forma de optimizar
Fractale
1
¿podría ser que esta función ya no funciona?
PV8
¿Cómo se llama esta sintaxis?
Burrito
29

Suponiendo que desea obtener las columnas 1 y 9 con ese fragmento de código, debería ser:

extractedData = data[:,[1,9]]
Michael J. Barber
fuente
14

si desea extraer solo algunas columnas:

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

si desea excluir columnas específicas:

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

Una cosa que me gustaría señalar es que, si el número de columnas que desea extraer es 1, la matriz resultante no sería una matriz Mx1 como podría esperar, sino una matriz que contiene los elementos de la columna que extrajo.

Para convertirlo a Matrix , se debe usar el método de remodelación (M, 1) en la matriz resultante.

Daksh
fuente
2
También puede lograr esto usando dos puntos, por ejemplo data[:, 8:9]. Esto toma la columna ocho pero no elimina la dimensión extra.
Jan Kukacka
data [:, 8] también seleccionará la octava columna y devolverá una matriz
Mx1
5

Sólo:

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

Las columnas no necesitan estar en orden:

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

Una cosa más a la que debe prestar atención al seleccionar columnas de la matriz ND utilizando una lista como esta:

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

Si está eliminando una dimensión (seleccionando solo una fila, por ejemplo), la matriz resultante se permutará (por alguna razón) . Entonces:

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

Puedes usar :

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

Rahul
fuente
2
Una buena respuesta siempre tendrá una explicación de lo que se hizo y por qué se hizo de esa manera, no solo para el OP sino para los futuros visitantes de SO. Agregue alguna descripción para que otros entiendan.
Rucha Bhatt Joshi
-3

también puede usar extraídoData = datos ([:, 1], [:, 9])

Pranav Mahajan
fuente