Matriz numpy para matriz

149

Eu estou usando numpy. Eu tenho uma matriz com 1 coluna e N linhas e quero obter uma matriz com N elementos.

Por exemplo, se eu tiver M = matrix([[1], [2], [3], [4]]), quero receber A = array([1,2,3,4]).

Para conseguir isso, eu uso A = np.array(M.T)[0]. Alguém conhece uma maneira mais elegante de obter o mesmo resultado?

Obrigado!

yassin
fonte
Ivnerse questão: converter uma matriz numpy 2D para uma matriz numpy 2D
Tobias KIENZLER

Respostas:

192

Se você quiser algo um pouco mais legível, faça o seguinte:

A = np.squeeze(np.asarray(M))

Equivalentemente, você também pode fazer:, A = np.asarray(M).reshape(-1)mas isso é um pouco menos fácil de ler.

Joe Kington
fonte
9
Pouco divertido da minha parte ... por que numpy tem matrizes e matrizes como entidades separadas. É IMHO tão atípico. Obrigado por esta dica @ Joe.
Naijaba
6
@Naijaba - Pelo que vale a pena, a classe matrix é efetivamente (mas não formalmente) depreciada. Está lá principalmente para fins históricos. A remoção numpy.matrixé um pouco controversa, mas os desenvolvedores entorpecidos concordam muito com você de que ter os dois é antitônico e irritante por várias razões. No entanto, a quantidade de códigos antigos e não mantidos "em estado selvagem" utilizados matrixdificulta a remoção total.
Joe Kington
1
Sem mencionar, a multiplicação de matriz verdadeira foi adicionada apenas para matrizes no Numpy 1.10 e ainda está basicamente na versão beta. Isso significa que muitas pessoas (inclusive eu) ainda precisam usar matrizes em vez de matrizes para fazer o que queremos. docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html
Georges Oates Larsen
1
Matrizes esparsas são fundamentais para o aprendizado de máquina com eficiência de memória (por exemplo, sklearn). De fato, existem sparse matrixtipos diferentes scipy, que permitem acesso eficiente por linhas ou colunas. Eu imagino que isso possa ser um problema para mesclar os conceitos de matriz e matriz. Dito isso, estou me perguntando se também poderia ser introduzido um sparse arraytipo e se existem planos para isso. Alguma pista?
Pms
Eu acho que .flatten () funciona tão bem quanto .squeeze (), desde que você queira uma matriz 1D no final.
wordsforthewise
122
result = M.A1

https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.matrix.A1.html

matrix.A1
1-d base array
hpaulj
fonte
6
Eu acho que essa resposta é melhor do que a resposta aceita, em termos de performance, e simplicidade
dariush
M.A1 é ótimo, a mesma implementação que "percorrer" e "achatar" e, nesse caso, não causa nenhuma cópia de dados A, portanto, permanece vinculada a M, o que pode causar surpresas se A e / ou M forem mutáveis. O M.flat alternativo genuíno que retorna o gerador "flatiter" (semântica somente leitura) np.squeeze (M) # fornece uma visualização para remover as dimensões do tamanho 1, ok aqui também, mas não é garantido que seja 1-d para a forma geral de np. H, -1) # é geralmente uma vista dependendo da compatibilidade forma, este "-1" é uma forma indirecta para fazer A1 / desfiada / achatar
jayprich
13
A, = np.array(M.T)

depende do que você quer dizer com elegância, suponho, mas é o que eu faria

mvu
fonte
11

Você pode tentar a seguinte variante:

result=np.array(M).flatten()
bolha
fonte
7
np.array(M).ravel()

Se você se importa com velocidade; Mas se você se importa com a memória:

np.asarray(M).ravel()
Kevad
fonte
Melhoraria a qualidade da sua resposta se você explicasse o porquê
Milo Wielondek 10/10/1919
6

Ou você pode tentar evitar alguns temps com

A = M.view(np.ndarray)
A.shape = -1
Pierre GM
fonte
2

Primeiro, o Mv = numpy.asarray(M.T)que fornece uma matriz 4x1, mas 2D.

Em seguida, execute A = Mv[0,:], o que lhe dá o que deseja. Você poderia colocá-los juntos numpy.asarray(M.T)[0,:],.

oracleyue
fonte
2

Isso converterá a matriz em matriz

A = np.ravel(M).T
Siraj S.
fonte
0

As funções ravel () e flatten () do numpy são duas técnicas que eu tentaria aqui. Gostaria de acrescentar às postagens feitas por Joe , Siraj , bubble e Kevad .

Ravel:

A = M.ravel()
print A, A.shape
>>> [1 2 3 4] (4,)

Achatar:

M = np.array([[1], [2], [3], [4]])
A = M.flatten()
print A, A.shape
>>> [1 2 3 4] (4,)

numpy.ravel()é mais rápido , pois é uma função no nível da biblioteca que não faz nenhuma cópia da matriz. No entanto, qualquer alteração na matriz A será transferida para a matriz original M se você estiver usandonumpy.ravel() .

numpy.flatten()é mais lento quenumpy.ravel() . Mas se você está usando numpy.flatten()para criar A, em seguida, muda em um não vai ter transitado para a matriz M originais .

numpy.squeeze()e M.reshape(-1)são mais lentos que numpy.flatten()e numpy.ravel().

%timeit M.ravel()
>>> 1000000 loops, best of 3: 309 ns per loop

%timeit M.flatten()
>>> 1000000 loops, best of 3: 650 ns per loop

%timeit M.reshape(-1)
>>> 1000000 loops, best of 3: 755 ns per loop

%timeit np.squeeze(M)
>>> 1000000 loops, best of 3: 886 ns per loop
Siddharth Satpathy
fonte