Eu uso Python e NumPy e tenho alguns problemas com "transpose":
import numpy as np
a = np.array([5,4])
print(a)
print(a.T)
Invocar a.T
não está transpondo a matriz. Se a
for, por exemplo [[],[]]
, ele transpõe corretamente, mas eu preciso da transposição de [...,...,...]
.
Respostas:
Está funcionando exatamente como deveria. A transposição de uma matriz 1D ainda é uma matriz 1D ! (Se você está acostumado ao matlab, ele basicamente não tem o conceito de uma matriz 1D. As matrizes "1D" do Matlab são 2D.)
Se você deseja transformar seu vetor 1D em uma matriz 2D e depois transpor, basta cortá-lo com
np.newaxis
(ouNone
, eles são iguais,newaxis
é apenas mais legível).De um modo geral, você não precisa se preocupar com isso. Adicionar a dimensão extra geralmente não é o que você deseja, se você está apenas fazendo isso por hábito. O Numpy transmitirá automaticamente uma matriz 1D ao fazer vários cálculos. Geralmente, não há necessidade de distinguir entre um vetor de linha e um vetor de coluna (nenhum dos quais são vetores . Ambos são 2D!) Quando você deseja apenas um vetor.
fonte
np.arange
fazer rapidamente uma matriz 1D. Funciona exatamente da mesma maneira paraa = np.array([5,4])
.()
não indicam uma dimensão adicional no numpy. Sea = np.arange(10)
entãoa
éarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
como produzido pora.__repr__()
. Este é uma.ndim --> 1
vetor unidimensional (ou seja ), conforme indicado entre colchetes[]
. Oarray( ... )
não é visto quando você faz umprint(a)
ou outroa.__str__()
.np.vstack()
a operação a ser mais explícito:print np.vstack(a)
.Use dois pares de colchetes em vez de um. Isso cria uma matriz 2D, que pode ser transposta, ao contrário da matriz 1D criada se você usar um par de colchetes.
Exemplo mais completo:
Use o
shape
método de numpy para ver o que está acontecendo aqui:fonte
Para matrizes 1D :
Depois de entender que -1 aqui significa "quantas linhas forem necessárias", acho que essa é a maneira mais legível de "transpor" uma matriz. Se sua matriz é de maior dimensionalidade, basta usar
a.T
.fonte
transpose
ereshape
modificam a matriz de maneiras diferentes (a forma da imagem resultante é a mesma, mas os elementos são colocados de maneira diferente).Você pode converter um vetor existente em uma matriz envolvendo-o em um conjunto extra de colchetes ...
numpy também tem uma
matrix
classe (veja matriz vs. matriz ) ...fonte
matriz 1D numpy -> matriz de colunas / linhas:
E como @ joe-kington disse, você pode substituir
None
comnp.newaxis
para facilitar a leitura.fonte
Para 'transpor' uma matriz 1d para uma coluna 2d, você pode usar
numpy.vstack
:Também funciona para listas de baunilha:
fonte
vstack
?np.concatenate([atleast_2d(_m) for _m in tup], 0)
. Ele divide a matriz em (1,1) matrizes e concatena essas! No processo, ele faz uma cópia, enquanto todos os que estão remodelados fazem uma visualização.Você só pode transpor uma matriz 2D. Você pode usar
numpy.matrix
para criar uma matriz 2D. Isso está atrasado três anos, mas estou apenas adicionando ao possível conjunto de soluções:fonte
np.matrix
não é necessário e geralmente está sendo desencorajado.em vez disso, use
arr[:,None]
para criar o vetor da colunafonte
A transposição de
é
bem, o código é:
este é um link para mais informações:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html
fonte
Outra solução .... :-)
fonte
Estou apenas consolidando o post acima, espero que ajude outras pessoas a economizar algum tempo:
A matriz abaixo tem
(2, )
dimensão, é uma matriz 1-D,Há duas maneiras de transpor uma matriz 1-D:
corte-o com "np.newaxis" ou nenhum.
outra maneira de escrever, o acima sem
T
operação.!Agrupar [] ou usar np.matrix significa adicionar uma nova dimensão.
fonte
Como alguns dos comentários acima mencionados, a transposição de matrizes 1D são matrizes 1D, portanto, uma maneira de transpor uma matriz 1D seria converter a matriz em uma matriz da seguinte forma:
fonte
O nome da função em
numpy
é column_stack .fonte
Existe um método não descrito nas respostas, mas descrito na documentação para o
numpy.ndarray.transpose
método:Pode-se fazer:
Qual (imo) é melhor do que usar
newaxis
.fonte
Basicamente, o que a função de transposição faz é trocar a forma e os passos da matriz:
No caso de um array numpy 1D (array 1), a forma e os passos são tuplas de 1 elemento e não podem ser trocados, e a transposição de um array 1D retorna-o inalterado. Em vez disso, você pode transpor um "vetor de linha" (matriz numpy de forma
(1, n)
) para um "vetor de coluna" (matriz numpy de forma(n, 1)
). Para conseguir isso, você deve primeiro converter sua matriz numpy 1D em vetor de linha e depois trocar a forma e as passadas (transpor). Abaixo está uma função que faz isso:Exemplo:
É claro que você não precisa fazer isso dessa maneira, já que possui uma matriz 1D e pode remodelá-la diretamente na
(n, 1)
matriz pora.reshape((-1, 1))
oua[:, None]
. Eu só queria demonstrar como a transposição de uma matriz funciona.fonte
A maneira como aprendi a implementar isso de maneira compacta e legível para matrizes 1-D, até agora:
numpy.r_ e numpy.c_ convertem objetos de fatia em concatenação ao longo do primeiro e do segundo eixo, respectivamente. Portanto, o fatiamento v2 [: 0] na transposição de volta da matriz vertical v2 para a matriz horizontal h2
numpy.vstack é equivalente à concatenação ao longo do primeiro eixo depois que as matrizes 1-D da forma (N) foram remodeladas para (1, N). Recria matrizes divididas por vsplit .
fonte