105 votes

Quel est l'équivalent de repmat de MATLAB dans NumPy ?

Je voudrais exécuter l'équivalent du code MATLAB suivant à l'aide de NumPy : repmat([1; 1], [1 1 1]) . Comment pourrais-je y parvenir ?

109voto

robince Points 6523

Voici une bien meilleure (officielle) NumPy pour les utilisateurs de Matlab link - J'ai bien peur que le mathesaurus ne soit pas tout à fait à jour.

L'équivalent numpy de repmat(a, m, n) es tile(a, (m, n)) .

Cela fonctionne avec plusieurs dimensions et donne un résultat similaire à celui de matlab. (Numpy donne un tableau de sortie en 3d comme on peut s'y attendre - matlab, pour une raison quelconque, donne une sortie en 2d - mais le contenu est le même).

Matlab :

>> repmat([1;1],[1,1,1])

ans =
     1
     1

Python :

In [46]: a = np.array([[1],[1]])
In [47]: np.tile(a, [1,1,1])
Out[47]: 
array([[[1],
        [1]]])

3 votes

Quand j'essaye size(repmat([1;1],[1,1,2])) il obtient ans = 2 1 2 [en matlab] mais en python np.tile(a,[1,1,2]).shape il obtient(1, 2, 2) , je veux que numpy donne le même résultat que matlab

3 votes

Np.tile(a[ :,np.newaxis],[1,1,2]) - cela donne la même chose. Le problème est que la tuile favorise a à la dimension de la tuile argument par prévenant de nouveaux axes si nécessaire. Matlab semble fonctionner dans l'autre sens. De même, avec le pavage 4d, vous aurez besoin de nouveaux axes deux fois... donc np.tile(a[:,newaxis,newaxis],[1,2,3,4]) = size(repmat(a,[1 2 3 4])) selon les besoins...

17voto

kwatford Points 11658

Notez que certaines des raisons pour lesquelles vous auriez besoin d'utiliser repmat de MATLAB sont prises en charge par l'outil NumPy diffusion qui vous permet d'effectuer divers types de calculs avec des tableaux de forme similaire. Ainsi, si vous avez, par exemple, un tableau 1600x1400x3 représentant une image en trois couleurs, vous pouvez (par élément) le multiplier par [1.0 0.25 0.25] pour réduire la quantité de vert et de bleu à chaque pixel. Voir le lien ci-dessus pour plus d'informations.

3 votes

Non pas que Matlab puisse faire cette diffusion aussi bien, si vous utilisez bsxfun .

11voto

XavierStuvw Points 527

C'est ainsi que je l'ai compris après avoir un peu bricolé. Je suis heureux d'être corrigé et j'espère que cela vous aidera.

Disons que vous avez une matrice M de 2x3 éléments. Cela a deux dimensions, évidemment.


Je ne voyais pas de différence entre Matlab et Python lorsqu'on demandait de manipuler la matrice d'entrée selon les dimensions que la matrice possède déjà. Ainsi, les deux commandes

repmat(M,m,n) % matlab

np.tile(M,(m,n)) # python

sont réellement équivalentes pour une matrice de rang 2 (deux dimensions).


Les choses deviennent contre-intuitives lorsque vous demandez la répétition/le basculement sur plus de dimensions que la matrice d'entrée. Si l'on revient à la matrice M de rang deux et de forme 2x3, il suffit de regarder ce qui arrive à la taille/forme de la matrice de sortie. Disons que la séquence à manipuler est maintenant 1,1,2.

En Matlab

> size(repmat(M,1,1,2))
ans =

    2   3   2

il a copié les deux premières dimensions (lignes et colonnes) de la matrice d'entrée et les a répétées une fois dans une nouvelle troisième dimension (copiée deux fois, donc). Fidèle à la dénomination repmat pour la matrice de répétition.

En Python

>>> np.tile(M,(1,1,2)).shape
(1, 2, 6)

il a appliqué une procédure différente puisque, je présume, la séquence (1,1,2) est lue différemment que dans Matlab. Le nombre de copies dans le sens des colonnes, des lignes et de la dimension hors plan est lu de droite à gauche. L'objet résultant a une forme différente de celle de Matlab. On ne peut plus affirmer que repmat y tile sont des instructions équivalentes.


Afin d'obtenir tile pour se comporter comme repmat En Python, il faut s'assurer que la matrice d'entrée a autant de dimensions que d'éléments dans la séquence. Ceci est réalisé, par exemple, par un petit préconditionnement et la création d'un objet connexe N

N = M[:,:,np.newaxis]

Ensuite, du côté de l'entrée, on a N.shape = (2,3,1) plutôt que M.shape = (2,3) et du côté de la sortie

>>> np.tile(N,(1,1,2)).shape
(2, 3, 2)

qui était la réponse de size(repmat(M,1,1,2)) . Je suppose que c'est parce que nous avons demandé à Python d'ajouter la troisième dimension à la droite de (2,3) plutôt qu'à sa gauche, de sorte que Python calcule la séquence (1,1,2) comme cela était prévu dans la façon dont Matlab l'a lue.

L'élément dans [:,:,0] dans la réponse Python pour N contiendra les mêmes valeurs que l'élément (:,:,1) la réponse de Matlab pour M .


Enfin, je n'arrive pas à trouver un équivalent pour repmat quand on utilise le produit de Kronecker à partir de

>>> np.kron(np.ones((1,1,2)),M).shape
(1, 2, 6)

sauf si I alors précondition M en N comme ci-dessus. Je dirais donc que la manière la plus générale d'avancer est d'utiliser les moyens de np.newaxis .


Le jeu devient plus délicat lorsque l'on considère une matrice L de rang 3 (trois dimensions) et le cas simple où aucune nouvelle dimension n'est ajoutée dans la matrice de sortie. Ces deux instructions apparemment équivalentes ne produiront pas les mêmes résultats.

repmat(L,p,q,r) % matlab

np.tile(L,(p,q,r)) # python

car les directions de la ligne, de la colonne, hors du plan sont (p,q,r) dans Matlab et (q,r,p) dans Python, ce qui n'était pas visible avec les tableaux de rang 2. Là, il faut être prudent et obtenir les mêmes résultats avec les deux langages nécessiterait plus de préconditionnement.


Je suis conscient que ce raisonnement peut ne pas être général, mais je n'ai pu l'élaborer que jusqu'ici. J'espère que cela incitera d'autres personnes à le mettre à l'épreuve.

9voto

rcs Points 22112

Voir NumPy pour les utilisateurs de Matlab .

Matlab :

repmat(a, 2, 3)

Numpy :

numpy.kron(numpy.ones((2,3)), a)

Matlib dans Numpy ( numpy.matlib.repmat() ):

numpy.matlib.repmat(a, 2, 3)

6voto

Steve Tjoa Points 15116

Savoir à la fois tile y repeat .

x = numpy.arange(5)
print numpy.tile(x, 2)
print x.repeat(2)

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