236 votes

"Clonage" de vecteurs lignes ou colonnes

Il est parfois utile de "cloner" un vecteur ligne ou colonne en une matrice. Par clonage, j'entends la conversion d'un vecteur ligne tel que

[1, 2, 3]

Dans une matrice

[[1, 2, 3],
 [1, 2, 3],
 [1, 2, 3]]

ou un vecteur colonne tel que

[[1],
 [2],
 [3]]

en

[[1, 1, 1]
 [2, 2, 2]
 [3, 3, 3]]

Dans MATLAB ou octave, cela se fait assez facilement :

 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

Je veux répéter cela en numpy, mais sans succès

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.]])

Pourquoi la première méthode ( In [16] ) fonctionne ? Existe-t-il un moyen de réaliser cette tâche en python de manière plus élégante ?

7 votes

Dans Matlab, notez qu'il est beaucoup plus rapide d'utiliser repmat : repmat([1 2 3],3,1) ou repmat([1 2 3].',1,3)

0 votes

Octave a également repmat .

0 votes

Pour ceux qui souhaitent faire la même chose avec un dataframe pandas, consultez la page tile_df lien ici

0voto

Mad Physicist Points 3218

Pour répondre à la question proprement dite, maintenant que près d'une douzaine d'approches pour contourner une solution ont été publiées : x.transpose inverse la forme de x . L'un des effets secondaires intéressants est que si x.ndim == 1 la transposition ne fait rien.

Ceci est particulièrement déroutant pour les personnes venant de MATLAB, où tous les tableaux ont implicitement au moins deux dimensions. La façon correcte de transposer un tableau numpy 1D n'est pas x.transpose() ou x.T mais plutôt

x[:, None]

ou

x.reshape(-1, 1)

À partir de là, vous pouvez multiplier par une matrice de uns, ou utiliser l'une des autres approches suggérées, à condition de respecter les différences (subtiles) entre MATLAB et numpy.

-1voto

kibitzforu Points 119
import numpy as np
x=np.array([1,2,3])
y=np.multiply(np.ones((len(x),len(x))),x).T
print(y)

les rendements :

[[ 1.  1.  1.]
 [ 2.  2.  2.]
 [ 3.  3.  3.]]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X