Suponha que eu tenha:
test = numpy.array([[1, 2], [3, 4], [5, 6]])
test[i]
me deixa om linha da matriz (por exemplo [1, 2]
). Como posso acessar a i - ésima coluna? (por exemplo [1, 3, 5]
). Além disso, isso seria uma operação cara?
>>> test[:,0]
array([1, 3, 5])
Similarmente,
>>> test[1,:]
array([3, 4])
permite acessar linhas. Isso é coberto na Seção 1.4 (Indexação) da referência NumPy . Isso é rápido, pelo menos na minha experiência. É certamente muito mais rápido do que acessar cada elemento em um loop.
E se você quiser acessar mais de uma coluna por vez, poderá:
fonte
test[:,[0,2]]
apenas acessa os dados, por exemplo,test[:, [0,2]] = something
modificaria o teste e não criaria outra matriz. Mascopy_test = test[:, [0,2]]
, de fato, cria uma cópia como você diz.test[:,[0,2]]
apenas acessar os dados enquantotest[:, [0, 2]][:, [0, 1]]
não? Parece muito pouco intuitivo que fazer a mesma coisa novamente tenha um resultado diferente.esse comando fornece um vetor de linha; se você quiser fazer um loop sobre ele, tudo bem, mas se você quiser empilhar com alguma outra matriz com a dimensão 3xN, terá
enquanto
fornece um vetor de coluna, para que você possa executar operações de concatenação ou hstack.
por exemplo
fonte
Você também pode transpor e retornar uma linha:
fonte
Para obter várias colunas independentes, basta:
você receberá as colunas 0 e 2
fonte
Embora a pergunta tenha sido respondida, deixe-me mencionar algumas nuances.
Digamos que você esteja interessado na primeira coluna da matriz
Como você já sabe de outras respostas, para obtê-lo na forma de "vetor de linha" (matriz de formas
(3,)
), use o fatiamento:Para verificar se uma matriz é uma visualização ou cópia de outra matriz, você pode fazer o seguinte:
veja ndarray.base .
Além da diferença óbvia entre os dois (a modificação
arr_c1_ref
afetaráarr
), o número de etapas de bytes para percorrer cada um deles é diferente:ver avanços . Por que isso é importante? Imagine que você tem uma matriz muito grande em
A
vez dearr
:e você deseja calcular a soma de todos os elementos da primeira coluna,
A_c1_ref.sum()
ou seja, ouA_c1_copy.sum()
. Usar a versão copiada é muito mais rápido:Isso se deve ao número diferente de avanços mencionados anteriormente:
Embora pareça que usar cópias de colunas seja melhor, nem sempre é verdade pelo fato de que fazer uma cópia leva tempo e consome mais memória (nesse caso, foram necessários aproximadamente 200 µs para criar a
A_c1_copy
). No entanto, se precisamos da cópia em primeiro lugar, ou precisamos executar muitas operações diferentes em uma coluna específica da matriz e estamos bem em sacrificar a memória por velocidade, fazer uma cópia é o caminho a seguir.No caso de estarmos interessados em trabalhar principalmente com colunas, pode ser uma boa ideia criar nossa matriz na ordem das colunas principais ('F') em vez da ordem das linhas principais ('C') (que é o padrão ) e faça o fatiamento como antes para obter uma coluna sem copiá-la:
Agora, executar a operação de soma (ou qualquer outra) em uma exibição de coluna é muito mais rápido.
Por fim, deixe-me observar que transpor uma matriz e usar o corte de linhas é o mesmo que usar o corte de colunas na matriz original, porque a transposição é feita apenas trocando a forma e os passos da matriz original.
fonte
Então você pode selecionar a 2ª - 4ª coluna desta maneira:
fonte