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.

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


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

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]

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.


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

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

1

Puedes usar :

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


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

-1

Creo que la solución aquí ya no funciona con una actualización de la versión de Python, una forma de hacerlo con una nueva función de Python es:

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

que te da el resultado deseado.

La documentación que puede encontrar aquí: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html#pandas.DataFrame.to_numpy


la pregunta comienza con una matriz numpy, no un marco de datos
TMrtSmith

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.