Como se adiciona linhas a uma matriz numpy?
Eu tenho uma matriz A:
A = array([[0, 1, 2], [0, 2, 0]])
Desejo adicionar linhas a esta matriz de outra matriz X se o primeiro elemento de cada linha em X atender a uma condição específica.
As matrizes numpy não têm um método 'anexar' como o das listas, ou assim parece.
Se A e X fossem listas, eu simplesmente faria:
for i in X:
if i[0] < 3:
A.append(i)
Existe uma maneira numpythonic de fazer o equivalente?
Obrigado, S ;-)
Respostas:
O que é
X
? Se for um array 2D, como você pode comparar sua linha com um númeroi < 3
:?EDITAR após o comentário do OP:
adicione a
A
todas as linhas deX
onde o primeiro elemento< 3
:fonte
A
. Claramente, para pequenos problemas, como nesta resposta, isso não é um problema, mas pode ser mais preocupante para grandes dados.bem, você pode fazer isso:
fonte
Como essa pergunta foi feita 7 anos antes, na versão mais recente que eu estou usando é a versão numpy 1.13, e python3, estou fazendo a mesma coisa ao adicionar uma linha a uma matriz, lembre-se de colocar um colchete duplo no segundo argumento, caso contrário, aumentará o erro de dimensão.
Aqui eu estou adicionando na matriz A
com uma linha
mesmo uso em
np.r_
Apenas para alguém interessado, se você quiser adicionar uma coluna,
array = np.c_[A,np.zeros(#A's row size)]
seguindo o que fizemos antes na matriz A, adicionando uma coluna a ela
fonte
Você também pode fazer isso:
fonte
np.concatenate((A,newrow), axis=0)
1.12.1
(e no Python 3), parece que tentar concatenar um vetor para uma matriz aumentaValueError: all the input arrays must have same number of dimensions
. Parece que ele deseja que o vetor seja remodelado explicitamente em um vetor de coluna ou linha antes de estar disposto a concatená-lo.newrow = [[1,2,3]]
Se nenhum cálculo for necessário após cada linha, é muito mais rápido adicionar linhas no python e converter para numpy. Aqui estão os testes de temporização usando python 3.6 vs. numpy 1.14, adicionando 100 linhas, uma de cada vez:
Portanto, a solução simples para a pergunta original, de sete anos atrás, é usar vstack () para adicionar uma nova linha após converter a linha em uma matriz numpy. Mas uma solução mais realista deve considerar o fraco desempenho do vstack nessas circunstâncias. Se você não precisar executar a análise de dados na matriz após cada adição, é melhor armazenar em buffer as novas linhas em uma lista de linhas python (uma lista de listas, na verdade) e adicioná-las como um grupo à matriz numpy usando vstack () antes de fazer qualquer análise de dados.
fonte
fonte
Se você pode fazer a construção em uma única operação, algo como a resposta de indexação vstack-fancy-fancy é uma abordagem adequada. Mas se sua condição for mais complicada ou suas linhas surgirem rapidamente, convém aumentar a matriz. De fato, a maneira numptitônica de fazer algo assim - aumentar dinamicamente uma matriz - é aumentar dinamicamente uma lista:
As listas são altamente otimizadas para esse tipo de padrão de acesso; você não tem uma indexação multidimensional numpy conveniente enquanto estiver em forma de lista, mas enquanto estiver anexando, é difícil fazer melhor do que uma lista de matrizes de linha.
fonte
Eu uso 'np.vstack', que é mais rápido, EX:
fonte
Você pode usar
numpy.append()
para anexar uma linha à matriz numpty e remodelar para uma matriz posteriormente.fonte