HOWTO · NumPy

Como obter uma coluna de um array NumPy

Selecione uma ou mais colunas de um array NumPy bidimensional, preserve o formato necessário, filtre linhas e escolha entre uma visualização e uma cópia.

Nesta página

Para selecionar uma coluna de um array NumPy bidimensional, use array[:, column_index]. Os dois-pontos selecionam todas as linhas, e o número inteiro seleciona uma coluna com índice iniciado em zero. Por exemplo, data[:, 1] retorna a segunda coluna como um array unidimensional. Em vez disso, use data[:, 1:2] quando o código subsequente exigir um resultado bidimensional com formato (rows, 1).

Selecionar uma coluna e controlar seu formato

O NumPy indexa um array 2D como array[row_selection, column_selection]. Omitir a vírgula muda a operação: data[:][1] primeiro cria um slice completo e depois seleciona a linha 1, portanto não seleciona a coluna 1.

O exemplo a seguir abrange os casos comuns de seleção de colunas em um único programa reproduzível:

import numpy as np

data = np.array([[10, 11, 12], [20, 21, 22], [30, 31, 32]])

second = data[:, 1]
second_2d = data[:, 1:2]
adjacent = data[:, :2]
reordered = data[:, [2, 0]]
taken = np.take(data, [0, 2], axis=1)
filtered = data[data[:, 0] >= 20, 2]

print("second:", second, second.shape)
print("second_2d:\n", second_2d, second_2d.shape)
print("adjacent:\n", adjacent)
print("reordered:\n", reordered)
print("taken:\n", taken)
print("filtered:", filtered)

view = data[:, 1]
copy = data[:, 1].copy()
view[0] = 99
print("data after view edit:\n", data)
print("copy:", copy)

Resultado:

second: [11 21 31] (3,)
second_2d:
 [[11]
 [21]
 [31]] (3, 1)
adjacent:
 [[10 11]
 [20 21]
 [30 31]]
reordered:
 [[12 10]
 [22 20]
 [32 30]]
taken:
 [[10 12]
 [20 22]
 [30 32]]
filtered: [22 32]
data after view edit:
 [[10 99 12]
 [20 21 22]
 [30 31 32]]
copy: [11 21 31]

Um índice de coluna inteiro remove esse eixo, o que explica o formato (3,) de second. Um slice de um único elemento mantém o eixo, produzindo o formato (3, 1) de second_2d. Essa distinção é importante quando uma API espera uma entrada semelhante a uma matriz em vez de um vetor simples.

Selecionar várias colunas

Use um slice como data[:, :2] para colunas adjacentes. O slicing expressa um intervalo contínuo e geralmente produz uma visualização. Para colunas não adjacentes ou uma ordem personalizada, forneça uma lista de índices: data[:, [2, 0]]. Isso é indexação avançada e produz uma cópia em vez de uma visualização.

Uma lista de índices sempre mantém o eixo das colunas. Assim, data[:, [1]] tem o formato (3, 1), enquanto data[:, 1] tem o formato (3,). Uma lista também pode repetir uma coluna ou alterar sua posição, portanto valide índices fornecidos dinamicamente quando duplicatas ou a ordenação forem inesperadas. Use um slice quando as colunas formarem um intervalo simples e uma lista de índices quando a própria seleção for uma sequência.

np.take é uma alternativa que explicita o eixo. np.take(data, [0, 2], axis=1) seleciona as colunas 0 e 2; axis=1 é essencial porque as colunas ocupam o segundo eixo. Ela é particularmente útil quando o eixo ou os índices estão armazenados em variáveis.

Filtrar linhas antes de ler uma coluna

Uma condição booleana normalmente identifica linhas, não colunas. Crie a máscara de linhas a partir de uma coluna e coloque a coluna de saída desejada depois da vírgula. No exemplo, data[:, 0] >= 20 mantém as duas últimas linhas, e data[data[:, 0] >= 20, 2] retorna [22 32] da coluna 2. O comprimento da máscara deve corresponder ao número de linhas.

Decidir se você precisa de uma visualização ou de uma cópia

De acordo com as regras de indexação do NumPy, o slicing básico retorna uma visualização quando possível, enquanto a indexação avançada retorna uma cópia. Consequentemente, atribuir por meio de view = data[:, 1] pode alterar data, como demonstra o 99 na saída. Chame .copy() quando a coluna extraída precisar ser independente. Os valores copiados permanecem [11 21 31] depois que a visualização altera o array de origem.

Essas visualizações também mantêm acessível a memória de seu array base. Copie uma coluna pequena se manter um array de origem grande desperdiçaria memória depois que o restante dessa origem não fosse mais necessário.

Verificar as dimensões e os limites das colunas

Essas expressões pressupõem um array 2D. Um array 1D não tem eixo de colunas, portanto array[:, 0] gera um erro de indexação. Verifique array.ndim == 2 quando o formato da entrada for incerto. Para um array 2D, os índices de coluna não negativos válidos vão de 0 a array.shape[1] - 1; um índice fora desse intervalo gera IndexError. Índices negativos também são válidos dentro dos limites, portanto array[:, -1] seleciona a última coluna.