Às vezes, é útil "clonar" um vetor de linha ou coluna em uma matriz. Ao clonar, quero dizer converter um vetor de linha como
[1,2,3]
Em uma matriz
[[1,2,3]
[1,2,3]
[1,2,3]
]
ou um vetor de coluna como
[1
2
3
]
para dentro
[[1,1,1]
[2,2,2]
[3,3,3]
]
No matlab ou oitava, isso é feito com bastante facilidade:
x = [1,2,3]
a = ones(3,1) * x
a =
1 2 3
1 2 3
1 2 3
b = (x') * ones(1,3)
b =
1 1 1
2 2 2
3 3 3
Quero repetir isso numpy, mas sem sucesso
In [14]: x = array([1,2,3])
In [14]: ones((3,1)) * x
Out[14]:
array([[ 1., 2., 3.],
[ 1., 2., 3.],
[ 1., 2., 3.]])
# so far so good
In [16]: x.transpose() * ones((1,3))
Out[16]: array([[ 1., 2., 3.]])
# DAMN
# I end up with
In [17]: (ones((3,1)) * x).transpose()
Out[17]:
array([[ 1., 1., 1.],
[ 2., 2., 2.],
[ 3., 3., 3.]])
Por que o primeiro método ( In [16]
) não estava funcionando? Existe uma maneira de realizar essa tarefa em python de uma maneira mais elegante?
python
numpy
linear-algebra
Boris Gorelik
fonte
fonte
repmat
:repmat([1 2 3],3,1)
ourepmat([1 2 3].',1,3)
repmat
.tile_df
ligado aquiRespostas:
Aqui está uma maneira Pythonic elegante de fazer isso:
o problema com
[16]
parece ser que a transposição não tem efeito para uma matriz. você provavelmente está querendo uma matriz:fonte
(N,1)
matriz usando -shape.reshape(-1, 1)
)numpy.tile
como mostrado na resposta do pv .Use
numpy.tile
:ou para repetir colunas:
fonte
tile
método é 19,5 vezes mais rápido que o método na resposta atualmente aceita (usando o método do operador de multiplicação).(1, 3)
copia esta coluna três vezes, e é por isso que as linhas do resultado contêm um único elemento distinto cada.Primeiro, observe que nas operações de transmissão do numpy geralmente não é necessário duplicar linhas e colunas. Veja isto e isto para descrições.
Mas, para fazer isso, repetir e newaxis são provavelmente a melhor maneira
Este exemplo é para um vetor de linha, mas aplicar isso a um vetor de coluna é esperançosamente óbvio. repeat parece soletrar isso bem, mas você também pode fazê-lo através da multiplicação, como no seu exemplo
fonte
np.repeat
vsnp.tile
?Deixei:
Alocações de custo zero
Uma visão não ocupa nenhuma memória adicional. Assim, essas declarações são instantâneas:
Alocação forçada
Se você deseja forçar o conteúdo a residir na memória:
Todos os três métodos têm aproximadamente a mesma velocidade.
Computação
Todos os três métodos têm aproximadamente a mesma velocidade.
Conclusão
Se você deseja replicar antes de um cálculo, considere usar um dos métodos "alocação de custo zero". Você não sofrerá a penalidade de desempenho da "alocação forçada".
fonte
Eu acho que usar a transmissão numpy é o melhor e mais rápido
Eu fiz uma comparação da seguinte forma
cerca de 15 vezes mais rápido usando broadcast
fonte
None
para fazer a mesma coisa.Uma solução limpa é usar a função de produto externo do NumPy com um vetor de uns:
dá
n
linhas repetidas. Alterne a ordem dos argumentos para obter colunas repetidas. Para obter um número igual de linhas e colunas, você pode fazerfonte
Você pode usar
o bloco gerará os representantes do vetor
e remodelar dará a forma que você deseja
fonte
Se você possui um dataframe de pandas e deseja preservar os tipos, mesmo os categóricos, é uma maneira rápida de fazê-lo:
fonte
rendimentos:
fonte