Eu tenho duas matrizes unidimensionais simples no NumPy . Eu deveria ser capaz de concatená-los usando numpy.concatenate . Mas recebo este erro para o código abaixo:
TypeError: somente matrizes de comprimento 1 podem ser convertidas em escalares Python
Código
import numpy
a = numpy.array([1, 2, 3])
b = numpy.array([5, 6])
numpy.concatenate(a, b)
Por quê?
python
arrays
numpy
concatenation
numpy-ndarray
alta largura de banda
fonte
fonte
np.concatenat(..., axis)
. Se você deseja empilhá-los verticalmente, usenp.vstack
. Se você deseja empilhá-los (em várias matrizes) horizontalmente, usenp.hstack
. (Se você quiser empilhá-los em profundidade, ou seja, na 3ª dimensão, usenp.dstack
). Observe que os últimos são semelhantes aos pandaspd.concat
Respostas:
A linha deve ser:
As matrizes que você deseja concatenar precisam ser transmitidas como uma sequência, não como argumentos separados.
Na documentação do NumPy :
Ele estava tentando interpretar o seu
b
como o parâmetro do eixo, e é por isso que reclamou que não podia convertê-lo em um escalar.fonte
numpy.concatenate(a1, a2, a3)
ounumpy.concatenate(*[a1, a2, a3])
se preferir. O Python é suficientemente fluido para que a diferença pareça mais cosmética do que substancial, mas é bom quando a API é consistente (por exemplo, se todas as funções numpy que usam listas de argumentos de comprimento variável exigem sequências explícitas).def concatx(*sequences, **kwargs)
). Não é o ideal, pois você não consegue nomear explicitamente a palavra-chave args na assinatura dessa maneira, mas existem soluções alternativas.Existem várias possibilidades para concatenar matrizes 1D, por exemplo,
Todas essas opções são igualmente rápidas para matrizes grandes; para os pequenos,
concatenate
tem uma ligeira vantagem:A plotagem foi criada com perfplot :
fonte
np.concatenate
. Eles apenas massageiam a lista de entrada de várias maneiras antes da mão.np.stack
por exemplo, adiciona uma dimensão extra a todas as matrizes de entrada. Veja o código fonte deles. Somenteconcatenate
é compilado.np.concatenate
faz cópias das entradas. Esse custo de memória e tempo supera o tempo gasto 'massageando' a entrada.O primeiro parâmetro a
concatenate
deve ser uma sequência de matrizes para concatenar:fonte
Uma alternativa é usar a forma abreviada de "concatenar", que é "r _ [...]" ou "c _ [...]", conforme mostrado no código de exemplo abaixo (consulte http://wiki.scipy.org / NumPy_for_Matlab_Users para informações adicionais):
O que resulta em:
fonte
vector_b = [1,1,1,1] #short form of "array"
, Isto simplesmente não é verdade. vector_b será um tipo de lista padrão do Python. No entanto, o Numpy é muito bom em aceitar seqüências em vez de forçar todas as entradas a serem tipos numpy.array.Aqui estão mais abordagens para fazer isso usando
numpy.ravel()
,numpy.array()
utilizando o fato de que as matrizes 1D podem ser descompactadas em elementos simples:fonte
Mais alguns fatos dos documentos numpy :
Com sintaxe como
numpy.concatenate((a1, a2, ...), axis=0, out=None)
eixo = 0 para concatenação em linha eixo = 1 para concatenação em coluna
Espero que ajude !
fonte