it-swarm.com.de

Was ist das Äquivalent von MATLABs Repmat in NumPy?

Ich möchte das Äquivalent des folgenden MATLAB-Codes mit NumPy ausführen: repmat([1; 1], [1 1 1]). Wie würde ich das schaffen?

85
vernomcrp

Hier ist eine viel bessere (offizielle) NumPy für Matlab-Benutzer link - Ich fürchte, der Mathesaurus ist ziemlich veraltet.

Das numpy-Äquivalent von repmat(a, m, n) ist tile(a, (m, n))

Dies funktioniert mit mehreren Dimensionen und ergibt ein ähnliches Ergebnis wie Matlab. (Numpy gibt wie erwartet ein 3D-Ausgabearray aus - Matlab liefert aus irgendeinem Grund eine 2d-Ausgabe - der Inhalt ist jedoch derselbe).

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]]])
88
robince

Beachten Sie, dass einige der Gründe, die Sie für die Verwendung von MATLABs Repmat benötigen, durch den Mechanismus broadcasting von NumPy erledigt werden, mit dem Sie verschiedene Arten von Berechnungen mit Arrays ähnlicher Form durchführen können. Wenn Sie also beispielsweise ein 1600x1400x3-Array haben, das ein 3-Farben-Bild darstellt, können Sie es (elementweise) mit [1.0 0.25 0.25] multiplizieren, um die Menge an Grün und Blau an jedem Pixel zu reduzieren. Weitere Informationen finden Sie unter dem obigen Link.

16
kwatford

Siehe NumPy für Matlab-Benutzer .

Matlab:

repmat(a, 2, 3)

Numpy:

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

Kenne sowohl tile als auch repeat.

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

So habe ich es aus einem bisschen Fummeln verstanden. Ich freue mich, korrigiert zu werden und hoffe, das hilft.

Angenommen, Sie haben eine Matrix M aus 2x3 Elementen. Dies hat offensichtlich zwei Dimensionen.


Ich konnte keinen Unterschied zwischen Matlab und Python erkennen, während ich darum bat, die Eingabematrix entlang der Dimensionen zu bearbeiten, die die Matrix bereits hat. Also die beiden Befehle

repmat(M,m,n) % matlab

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

sind wirklich äquivalent für eine Matrix von Rang 2 (zwei Dimensionen). 


Die Sache ist nicht intuitiv, wenn Sie mehr Dimensionen als die Eingabematrix nach Wiederholung/Kacheln fragen. Um auf die Matrix M von Rang zwei und die Form 2x3 zurückzugreifen, genügt es zu betrachten, was mit der Größe/Form der Ausgabematrix geschieht. Angenommen, die Manipulationssequenz ist jetzt 1,1,2.

In Matlab

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

    2   3   2

sie hat die ersten beiden Dimensionen (Zeilen und Spalten) der Eingabematrix kopiert und diese einmal in eine neue dritte Dimension (dh zweimal kopiert) wiederholt. Entspricht der Benennung repmat für Wiederholungsmatrix. 

In Python

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

es hat ein anderes Verfahren angewandt, da die Sequenz (1,1,2) anders als in Matlab gelesen wird. Die Anzahl der Kopien in Richtung der Spalten, Zeilen und außerhalb der Ebene wird von rechts nach links gelesen. Das resultierende Objekt hat eine andere Form als Matlab. Man kann nicht mehr behaupten, dass repmat und tile gleichwertige Anweisungen sind.


Damit sich tile wie repmat verhält, muss in Python sichergestellt werden, dass die Eingabematrix so viele Dimensionen hat, wie die Elemente in der Sequenz sind. Dies geschieht zum Beispiel durch ein wenig Vorkonditionierung und Erstellen eines zugehörigen Objekts N

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

Dann hat man eingangsseitig N.shape = (2,3,1) statt M.shape = (2,3) und ausgangsseitig

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

welches war die Antwort von size(repmat(M,1,1,2)). Ich nehme an, dies liegt daran, dass wir Python dazu gebracht haben, die dritte Dimension rechts von (2,3) und nicht links davon hinzuzufügen, sodass Python die Sequenz (1,1,2) so ausarbeitet, wie sie im Matlab beabsichtigt war Lesart.

Das Element in [:,:,0] in der Python-Antwort für N enthält die gleichen Werte wie das Element (:,:,1) der Matlab-Antwort für M.


Schließlich kann ich anscheinend keine Entsprechung für repmat finden, wenn das Produkt von Kronecker aus verwendet wird

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

es sei denn, ich gebe dann M in N wie oben. Ich würde also argumentieren, dass der allgemeinste Weg, um weiterzugehen, die Wege von np.newaxis ist.


Das Spiel wird schwieriger, wenn wir eine Matrix L von Rang 3 (drei Dimensionen) betrachten und den einfachen Fall, dass keine neuen Dimensionen in der Ausgabematrix hinzugefügt werden. Diese zwei scheinbar gleichwertigen Anweisungen führen nicht zu den gleichen Ergebnissen

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

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

weil die Zeilen-, Spalten- und Out-of-Plane-Richtungen in Matlab (p, q, r) und in Python (q, r, p) sind, was bei Rang-2-Arrays nicht sichtbar war. Dort muss man vorsichtig sein, und wenn man mit den beiden Sprachen die gleichen Ergebnisse erzielen möchte, wäre eine Vorbedingung erforderlich. 


Ich bin mir bewusst, dass diese Überlegung vielleicht nicht allgemein ist, aber ich könnte es nur so weit ausarbeiten. Hoffentlich lädt dies andere Leute ein, es auf eine härtere Probe zu stellen.

4
XavierStuvw

numpy.matlib hat eine repmat - Funktion mit einer ähnlichen Schnittstelle wie die matlab-Funktion

from numpy.matlib import repmat
repmat( np.array([[1],[1]]) , 1, 1)
0
e-malito
import numpy as np

np.repeat(['a','b'], [2,5])
>>> array(['a', 'a', 'b', 'b', 'b', 'b', 'b'], dtype='<U1')

np.repeat([1,2], [2,5])
>>> array([1, 1, 2, 2, 2, 2, 2])

np.repeat(np.array([1,2]), [3]).reshape(2,3)
>>> array([[1, 1, 1],
           [2, 2, 2]])

np.repeat(np.array([1,2]), [2,4]).reshape(3,2)
>>> array([[1, 1],
           [2, 2],
           [2, 2]])

np.repeat(np.matrix('1 2; 3 4'), [2]).reshape(4,2)
>>> matrix([[1, 1],
            [2, 2],
            [3, 3],
            [4, 4]])
0
Hamidreza