Frage Was entspricht 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 erreichen?


76
2017-11-12 12:20


Ursprung


Antworten:


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

Das nüchterne Ä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 ein 3D-Ausgangs-Array, wie Sie erwarten würden - Matlab gibt aus irgendeinem Grund 2d Ausgabe - aber der Inhalt ist der gleiche).

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

82
2017-11-12 18:36



Beachten Sie, dass einige der Gründe, warum Sie MATLABs Repmat verwenden müssen, von NumPy erledigt werden Rundfunk- Mechanismus, mit dem Sie verschiedene Arten von Mathe mit Arrays ähnlicher Form ausführen können. Wenn Sie also ein 1600x1400x3-Array haben, das ein 3-farbiges Bild darstellt, könnten Sie es (elementweise) mit multiplizieren [1.0 0.25 0.25] um die Menge an Grün und Blau bei jedem Pixel zu reduzieren. Siehe den obigen Link für weitere Informationen.


16
2017-11-12 13:24



Sehen NumPy für Matlab-Benutzer.

Matlab:

repmat(a, 2, 3)

Numpy:

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

9
2017-11-12 13:09



Kenne beide tile und repeat.

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

5
2018-01-19 23:52



So habe ich es verstanden, etwas herumzuspielen. Gerne korrigiert werden und hoffe das hilft.

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


Ich konnte keinen Unterschied zwischen Matlab und Python feststellen, als ich bat, die Eingabematrix entlang der Dimensionen zu bearbeiten, die die Matrix bereits hat. Also die zwei 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 Dinge gehen kontraintuitiv vor sich, wenn Sie nach Wiederholungen / Tilings über mehr Dimensionen als die Eingabematrix fragen. Zurück zur Matrix M von Rang zwei und Form 2x3 reicht es aus, zu sehen, was mit der Größe / Form der Ausgabematrix passiert. Sagen wir, die Sequenz für die Manipulation ist jetzt 1,1,2.

In Matlab

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

    2   3   2

es hat die ersten zwei Dimensionen (Zeilen und Spalten) der Eingabematrix kopiert und hat diese einmal in eine neue dritte Dimension wiederholt (also doppelt kopiert). Getreu dem Namen repmat für Wiederholungsmatrix.

In Python

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

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


Um zu bekommen tile sich wie benehmen repmatIn Python muss man sicherstellen, dass die Eingabematrix so viele Dimensionen wie die Elemente in der Sequenz hat. Dies geschieht zum Beispiel durch ein kleines Vorkonditionieren und Erstellen eines verwandten Objekts N

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

Dann, auf der Eingangsseite hat man N.shape = (2,3,1) eher, als M.shape = (2,3) und auf der Ausgangsseite

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

Das war die Antwort von size(repmat(M,1,1,2)). Ich gehe davon aus, dass wir Python angewiesen haben, die dritte Dimension rechts von (2,3) statt links davon hinzuzufügen, damit Python die Sequenz (1,1,2) so ausführt, wie sie im Matlab vorgesehen war Art, es zu lesen.

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


Schließlich kann ich kein Gegenstück finden repmat wenn man das Kronecker Produkt aus benutzt

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

es sei denn, ich mache dann vor M in N wie oben. Also würde ich argumentieren, dass der allgemeinste Weg, um fortzufahren, ist, die Wege zu benutzen np.newaxis.


Das Spiel wird komplizierter, wenn wir eine Matrix betrachten L von Rang 3 (drei Dimensionen) und der einfache Fall, dass in der Ausgangsmatrix keine neuen Dimensionen hinzugefügt werden. Diese zwei scheinbar äquivalenten Anweisungen werden nicht die gleichen Ergebnisse liefern

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

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

weil die Zeilen-, Spalten-, Out-of-Plane-Richtungen in Matlab und (q, r, p) in Python (p, q, r) sind, was bei Rank-2-Arrays nicht sichtbar war. Da muss man vorsichtig sein, und das Erzielen der gleichen Ergebnisse mit den beiden Sprachen würde mehr Vorkonditionierung erfordern.


Ich bin mir bewusst, dass diese Argumentation nicht allgemein sein mag, aber ich könnte es nur so weit ausarbeiten. Hoffentlich lädt dies andere Kollegen ein, es auf eine härtere Probe zu stellen.


4
2018-03-27 19:48



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
2017-07-26 09:32