Le “clonage” de ligne ou de colonne vecteurs
Il est parfois utile de "cloner" une ligne ou une colonne de vecteur à une matrice. Par clonage, je veux dire la conversion d'un vecteur ligne tels que
[1,2,3]
Dans une matrice
[[1,2,3]
[1,2,3]
[1,2,3]
]
ou un vecteur colonne comme
[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 tiens à répéter ce dans numpy, mais en vain
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 n'était-ce pas la première méthode ([16]) de travail? Est-il un moyen pour accomplir cette tâche en python de manière plus élégante?
- Dans Matlab, remarque qu'il est beaucoup plus rapide à utiliser
repmat
:repmat([1 2 3],3,1)
ourepmat([1 2 3].',1,3)
- Octave a également
repmat
. - Pour ceux qui cherchent à faire la même avec une pandas dataframe la caisse de la
tile_df
lien ici
Vous devez vous connecter pour publier un commentaire.
Voici un élégant, Pythonic façon de le faire:
le problème avec
[16]
semble être que la transposition n'a pas d'effet pour un tableau. vous êtes probablement vouloir une matrice plutôt:(N,1)
forme de tableau à l'aide de.reshape(-1, 1)
)numpy.tile
comme indiqué dans le pv.'s réponse.Utilisation
numpy.tuile
:ou de répéter les colonnes:
tile
méthode est de 19,5 fois plus rapide que la méthode actuellement accepté de répondre (à l'aide de la multiplication-opérateur-méthode).(1, 3)
des copies de cette colonne de plus de trois fois, c'est pourquoi le nombre de lignes du résultat contenir un seul élément distinct de chacun.Abord de noter qu'avec numpy est de radiodiffusion des opérations, il n'est généralement pas nécessaire de dupliquer les lignes et les colonnes. Voir cette et cette pour les descriptions.
Mais pour ce faire, repeat et newaxis sont probablement la meilleure façon
Cet exemple est pour un vecteur ligne, mais de l'application d'un vecteur colonne, je l'espère, évident. répétez semble sort bien, mais vous pouvez aussi le faire via la multiplication comme dans votre exemple
np.repeat
vsnp.tile
?Je pense que l'aide à la diffusion dans numpy est le meilleur, et le plus vite
J'ai fait une comparaison comme la suite
environ 15 fois plus rapide grâce à la diffusion
None
de faire la même chose.np.broadcast_to
est encore plus rapide quenp.tile
:Mais le plus rapide est @tom10 de la méthode:
Vous pouvez utiliser
tuile va générer les représentants de l'vecteur
et de remodeler la volonté de lui donner la forme que vous voulez
Une solution propre est d'utiliser NumPy externe-fonction du produit d'un vecteur de:
donne
n
répéter les lignes. Commutateur de l'argument afin d'obtenir de répéter les colonnes. Pour obtenir un nombre égal de lignes et de colonnes que vous pourriez fairerendements: