Digamos que eu tenho uma matriz NumPy a
:
a = np.array([
[1, 2, 3],
[2, 3, 4]
])
E eu gostaria de adicionar uma coluna de zeros para obter uma matriz b
:
b = np.array([
[1, 2, 3, 0],
[2, 3, 4, 0]
])
Como posso fazer isso facilmente no NumPy?
a = np.random.rand((N,N))
paraa = np.random.rand(N,N)
np.r_[ ... ]
enp.c_[ ... ]
são alternativas úteis paravstack
ehstack
, com colchetes [] em vez de redondo ().Alguns exemplos:
(A razão para colchetes [] em vez de round () é que o Python expande, por exemplo, 1: 4 em quadrado - as maravilhas da sobrecarga.)
fonte
np.c_[ * iterable ]
; veja listas de expressões .Use
numpy.append
:fonte
append
na verdade apenas chamaconcatenate
Uma maneira, usando o hstack , é:
fonte
dtype
parâmetro, ele não é necessário e nem mesmo permitido. Embora sua solução seja elegante o suficiente, preste atenção para não usá-la se precisar "anexar" frequentemente a uma matriz. Se você não pode criar toda a matriz de uma só vez e preenchê-la mais tarde, crie uma lista de matrizes ehstack
tudo de uma só vez.Acho o seguinte mais elegante:
Uma vantagem
insert
disso é que ele também permite inserir colunas (ou linhas) em outros lugares dentro da matriz. Além disso, em vez de inserir um único valor, você pode inserir facilmente um vetor inteiro, por exemplo, duplicar a última coluna:O que leva a:
No momento,
insert
pode ser mais lento que a solução de JoshAdel:fonte
insert(a, -1, ...)
para anexar a coluna. Acho que vou acrescentá-lo antes.a.shape[axis]
. I. e. para anexar uma linha, você faznp.insert(a, a.shape[0], 999, axis=0)
e para uma coluna, você faznp.insert(a, a.shape[1], 999, axis=1)
.Eu também estava interessado nesta questão e comparei a velocidade da
que todos fazem a mesma coisa para qualquer vetor de entrada
a
. Horários para o cultivoa
:Observe que todas as variantes não contíguas (em particular
stack
/vstack
) são eventualmente mais rápidas que todas as variantes contíguas.column_stack
(por sua clareza e velocidade) parece ser uma boa opção se você precisar de contiguidade.Código para reproduzir o gráfico:
fonte
stack
,hstack
,vstack
,column_stack
,dstack
são todas as funções auxiliares construídas em cima denp.concatenate
. Ao rastrear a definição de pilha , descobri quenp.stack([a,a])
está chamandonp.concatenate([a[None], a[None]], axis=0)
. Pode ser bom adicionarnp.concatenate([a[None], a[None]], axis=0).T
ao perfplot para mostrar quenp.concatenate
sempre pode ser pelo menos tão rápido quanto suas funções auxiliares.c_
ecolumn_stack
Eu acho que:
é mais elegante.
fonte
O np.concatenate também funciona
fonte
np.concatenate
parece ser 3 vezes mais rápido quenp.hstack
nas matrizes 2x1, 2x2 e 2x3.np.concatenate
também foi muito mais rápido do que copiar manualmente as matrizes para uma matriz vazia nas minhas experiências. Isso é consistente com a resposta de Nico Schlömer abaixo.Supondo que
M
é um ndarray (100,3) ey
é um ndarray (100,)append
pode ser usado da seguinte maneira:O truque é usar
Isso se converte
y
em uma matriz 2D (100, 1).agora dá
fonte
Eu gosto da resposta de JoshAdel por causa do foco no desempenho. Uma pequena melhoria no desempenho é evitar a sobrecarga de inicializar com zeros, apenas para ser substituída. Isso tem uma diferença mensurável quando N é grande, vazio é usado em vez de zeros e a coluna de zeros é escrita como uma etapa separada:
fonte
b[:,-1] = 0
. Além disso, com matrizes muito grandes, a diferença de desempenho senp.insert()
torna insignificante, o que pode sernp.insert()
mais desejável devido à sua sucessão.np.insert
também serve ao propósito.Ele insere valores, aqui
new_col
, antes de um determinado índice, aquiidx
ao longo de um eixo. Em outras palavras, os novos valores inseridos ocuparão aidx
coluna e moverão o que estava originalmente lá no e depoisidx
para trás.fonte
insert
não está no lugar, como se poderia assumir, com o nome da função (consulte os documentos vinculados na resposta).Adicione uma coluna extra a uma matriz numpy:
O
np.append
método de Numpy usa três parâmetros, os dois primeiros são matrizes numpy 2D e o terceiro é um parâmetro de eixo que instrui ao longo de qual eixo acrescentar:Impressões:
fonte
Um pouco atrasado para a festa, mas ninguém postou esta resposta ainda, por uma questão de integridade: você pode fazer isso com a compreensão da lista, em uma matriz Python simples:
fonte
Para mim, a próxima maneira parece bastante intuitiva e simples.
fonte
No meu caso, eu tive que adicionar uma coluna de uns a uma matriz NumPy
Após X.shape => (97, 2)
fonte
Existe uma função específica para isso. É chamado numpy.pad
Aqui está o que diz na doutrina:
fonte