Extraindo colunas específicas na matriz numpy


164

Esta é uma pergunta fácil, mas digo que tenho uma matriz MxN. Tudo o que eu quero fazer é extrair colunas específicas e armazená-las em outra matriz numpy, mas eu recebo erros de sintaxe inválidos. Aqui está o código:

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

Parece que a linha acima deve ser suficiente, mas acho que não. Olhei em volta, mas não consegui encontrar nada de sintaxe em relação a esse cenário específico.

Respostas:


272

Eu suponho que você queria colunas 1e 9? Isso é

data[:, [1, 9]]

Ou com nomes:

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

Você pode obter os nomes de data.dtype.names


Como fazer isso com nomes de colunas?
Zelphir Kaltstahl

9
data [:, ['Nome da coluna1', 'Nome da coluna2']]
code-assassin

é uma visão ou uma cópia? meu gargalo é nesta linha maneira que eu pesquisa para otimizar
Fractale

1
será que essa função não está mais funcionando?
PV8

Como é chamada essa sintaxe?
Burrito

29

Supondo que você deseja obter as colunas 1 e 9 com esse trecho de código, deve ser:

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

14

se você deseja extrair apenas algumas colunas:

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

se você deseja excluir colunas 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

Uma coisa que eu gostaria de destacar é que, se o número de colunas que você deseja extrair for 1, a matriz resultante não seria uma matriz Mx1 conforme o esperado, mas uma matriz contendo os elementos da coluna que você extraiu.

Para convertê-lo em Matrix, o método de remodelação (M, 1) deve ser usado na matriz resultante.


2
Além disso, você pode conseguir isso usando dois pontos, por exemplo data[:, 8:9]. Isso ocupa a coluna oito, mas não remove a dimensão extra.
Jan KUKACKA

data [:, 8] também escolherá a 8ª coluna e retornará uma matriz
Mx1

5

Somente:

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

As colunas não precisam estar em ordem:

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

Mais uma coisa que você deve prestar atenção ao selecionar colunas da matriz ND usando uma lista como esta:

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

Se você estiver removendo uma dimensão (selecionando apenas uma linha, por exemplo), a matriz resultante será (por algum motivo) permutada . Assim:

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

1

Você pode usar :

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


2
Uma boa resposta sempre terá uma explicação do que foi feito e por que foi feito dessa maneira, não apenas para o OP, mas para futuros visitantes do SO. Por favor, adicione uma descrição para fazer os outros entenderem.
Rucha Bhatt Joshi

-1

Eu acho que a solução aqui não está mais trabalhando com uma atualização da versão python, uma maneira de fazê-lo com uma nova função python, pois é:

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

o que lhe dá o resultado desejado.

A documentação que você pode encontrar aqui: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html#pandas.DataFrame.to_numpy


a questão começa com uma matriz numpy, não um trama de dados
TMrtSmith

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.