Je voudrais exécuter l'équivalent du code Matlab suivant à l' aide NumPy: repmat([1; 1], [1 1 1])
. Comment pourrais-je accomplir cela?
103
Voici un bien meilleur lien (officiel) NumPy pour les utilisateurs de Matlab - J'ai bien peur que celui de mathesaurus soit assez obsolète.
L'équivalent numpy de repmat(a, m, n)
est tile(a, (m, n))
.
Cela fonctionne avec plusieurs dimensions et donne un résultat similaire à matlab. (Numpy donne un tableau de sortie 3D comme on peut s'y attendre - matlab pour une raison quelconque donne une sortie 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]]])
a
la dimension de l'argument tuile en ajoutant de nouveaux axes si nécessaire. Matlab semble fonctionner dans l'autre sens. De même, avec le carrelage 4d, vous aurez besoin de newaxis deux fois ... donc sinp.tile(a[:,newaxis,newaxis],[1,2,3,4]) = size(repmat(a,[1 2 3 4]))
nécessaire ...Notez que certaines des raisons pour lesquelles vous auriez besoin d'utiliser le repmat de MATLAB sont prises en charge par le mécanisme de diffusion de NumPy , qui vous permet de faire différents types de mathématiques avec des tableaux de forme similaire. Donc, si vous aviez, par exemple, un tableau de 1 600 x 1 400 x 3 représentant une image à 3 couleurs, vous pourriez (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.la source
bsxfun
.Voir NumPy pour les utilisateurs de Matlab .
Matlab:
Numpy:
Matlib dans Numpy ( numpy.matlib.repmat () ):
la source
C'est ainsi que je l'ai compris après un peu de tripotage. Heureux d'être corrigé et j'espère que cela aidera.
Supposons que vous ayez une matrice M de 2x3 éléments. Cela a deux dimensions, évidemment.
Je ne voyais aucune différence entre Matlab et Python en demandant de manipuler la matrice d'entrée selon les dimensions que la matrice a déjà. Ainsi les deux commandes
sont vraiment équivalentes pour une matrice de rang 2 (deux dimensions).
Les choses deviennent contre-intuitives lorsque vous demandez une répétition / une mosaïque sur plus de dimensions que la matrice d'entrée. Pour en revenir à la matrice M de rang deux et de forme 2x3, il suffit de regarder ce qu'il advient de la taille / forme de la matrice de sortie. Disons que la séquence de manipulation est maintenant 1,1,2.
Dans Matlab
il a copié les deux premières dimensions (lignes et colonnes) de la matrice d'entrée et l'a répétée une fois dans une nouvelle troisième dimension (copiée deux fois, c'est-à-dire). Fidèle à la dénomination
repmat
de la matrice de répétition.En Python
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 Matlab. On ne peut plus affirmer cela
repmat
et cetile
sont des instructions équivalentes.Pour arriver
tile
à se comporter commerepmat
, en Python, il faut s'assurer que la matrice d'entrée a autant de dimensions que les éléments de la séquence. Cela se fait, par exemple, par un petit préconditionnement et la création d'un objet associé NEnsuite, du côté entrée, on a
N.shape = (2,3,1)
plutôt queM.shape = (2,3)
du côté sortiequi était la réponse de
size(repmat(M,1,1,2))
. Je présume que c'est parce que nous avons guidé Python pour ajouter la troisième dimension à droite de (2,3) plutôt qu'à sa gauche, afin que Python élabore la séquence (1,1,2) comme prévu dans le Matlab manière de le lire.L'élément
[:,:,0]
de la réponse Python pour N contiendra les mêmes valeurs que l'élément de(:,:,1)
la réponse Matlab pour M .Enfin, je n'arrive pas à trouver un équivalent pour
repmat
quand on utilise le produit Kronecker hors desauf si je préconditionne alors M en N comme ci-dessus. Je dirais donc que la manière la plus générale de passer à autre chose est d'utiliser les moyens de
np.newaxis
.Le jeu devient plus délicat quand 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
car les directions de ligne, de colonne, hors plan sont (p, q, r) dans Matlab et (q, r, p) en 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 langues demanderait plus de préconditionnement.
Je suis conscient que ce raisonnement n'est peut-être pas général, mais je ne pourrais y arriver que jusqu'ici. Espérons que cela invite d'autres camarades à le soumettre à un test plus difficile.
la source
Sachez à la fois
tile
etrepeat
.la source
numpy.matlib a une fonction repmat avec une interface similaire à la fonction matlab
la source
la source