Chciałbym wykonać odpowiednik następującego kodu MATLAB przy użyciu numpy: repmat([1; 1], [1 1 1])
. Jak miałbym to osiągnąć?
103
Oto znacznie lepszy (oficjalny) link do NumPy dla użytkowników Matlaba - obawiam się, że matezaurus jest dość nieaktualny.
Numpy odpowiednikiem repmat(a, m, n)
to tile(a, (m, n))
.
Działa to z wieloma wymiarami i daje podobny wynik do Matlab. (Numpy daje tablicę wyjściową 3D, jak można się spodziewać - matlab z jakiegoś powodu daje wyjście 2D - ale zawartość jest taka sama).
Matlab:
>> repmat([1;1],[1,1,1])
ans =
1
1
Pyton:
In [46]: a = np.array([[1],[1]])
In [47]: np.tile(a, [1,1,1])
Out[47]:
array([[[1],
[1]]])
a
na tym, że kafelek awansuje do wymiaru argumentu kafelek przez poprzedzanie nowych osi, jeśli to konieczne. Wydaje się, że Matlab działa w drugą stronę. Podobnie, z kafelkami 4d będziesz potrzebować newaxis dwa razy ... więcnp.tile(a[:,newaxis,newaxis],[1,2,3,4]) = size(repmat(a,[1 2 3 4]))
zgodnie z wymaganiami ...Zwróć uwagę, że niektóre powody, dla których musisz używać repmat MATLAB, są rozwiązywane przez mechanizm nadawania NumPy , który pozwala wykonywać różne rodzaje matematyki z tablicami o podobnym kształcie. Więc jeśli masz, powiedzmy, tablicę 1600x1400x3 reprezentującą 3-kolorowy obraz, możesz (elementarnie) pomnożyć ją przez,
[1.0 0.25 0.25]
aby zmniejszyć ilość zieleni i niebieskiego w każdym pikselu. Aby uzyskać więcej informacji, zobacz powyższy link.źródło
bsxfun
.Zobacz NumPy dla użytkowników Matlab .
Matlab:
Numpy:
Matlib w Numpy ( numpy.matlib.repmat () ):
źródło
W ten sposób zrozumiałem to, trochę się majstrując. Cieszę się, że zostałem poprawiony i mam nadzieję, że to pomoże.
Powiedzmy, że masz macierz M składającą się z elementów 2x3. Ma to oczywiście dwa wymiary.
Nie widziałem różnicy między Matlabem a Pythonem, prosząc o manipulowanie macierzą wejściową wzdłuż wymiarów, które już ma macierz. Stąd te dwa polecenia
są naprawdę równoważne dla macierzy rzędu 2 (dwa wymiary).
Sprawa jest sprzeczna z intuicją, gdy poprosisz o powtórzenie / kafelkowanie na większej liczbie wymiarów niż ma macierz wejściowa. Wracając do macierzy M rzędu drugiego i kształtu 2x3, wystarczy spojrzeć na to, co dzieje się z rozmiarem / kształtem macierzy wyjściowej. Powiedzmy, że kolejność manipulacji to teraz 1,1,2.
W Matlab
skopiował pierwsze dwa wymiary (wiersze i kolumny) macierzy wejściowej i powtórzył to raz do nowego trzeciego wymiaru (to znaczy skopiował dwukrotnie). Zgodnie z nazewnictwem
repmat
macierzy powtórzonych.W Pythonie
zastosował inną procedurę, ponieważ przypuszczam, że sekwencja (1, 1, 2) jest odczytywana inaczej niż w Matlabie. Liczbę kopii w kierunku kolumn, wierszy i wymiaru poza płaszczyzną odczytuje się od prawej do lewej. Powstały obiekt ma inny kształt niż Matlab. Nie można już tego twierdzić
repmat
itile
są to instrukcje równoważne.Aby
tile
zachowywać się takrepmat
, w Pythonie trzeba się upewnić, że macierz wejściowa ma tyle wymiarów, ile elementów jest w sekwencji. Odbywa się to na przykład poprzez wstępne uwarunkowanie i utworzenie powiązanego obiektu N.Następnie po stronie wejściowej mamy
N.shape = (2,3,1)
raczej niżM.shape = (2,3)
i po stronie wyjściowejco było odpowiedzią
size(repmat(M,1,1,2))
. Przypuszczam, że dzieje się tak dlatego, że poprowadziliśmy Pythona, aby dodać trzeci wymiar po prawej stronie (2,3), a nie po lewej stronie, dzięki czemu Python opracuje sekwencję (1,1,2) zgodnie z zamierzeniami Matlaba sposób czytania.Element w
[:,:,0]
odpowiedź Pythona N będą zawierać te same wartości, jak element(:,:,1)
odpowiedzi Matlab dla M .Wreszcie, nie wydaje mi się, aby znaleźć odpowiednik dla
repmat
sytuacji, w których używa się produktu Kroneckerchyba że następnie warunkuję M w N jak powyżej. Twierdziłbym więc, że najbardziej ogólnym sposobem posunięcia się naprzód jest użycie sposobów
np.newaxis
.Gra staje się trudniejsza, gdy weźmiemy pod uwagę macierz L rangi 3 (trzy wymiary) i prosty przypadek braku dodawania nowych wymiarów do macierzy wyjściowej. Te dwie pozornie równoważne instrukcje nie dadzą takich samych wyników
ponieważ wiersze, kolumny, kierunki poza płaszczyzną to (p, q, r) w Matlabie i (q, r, p) w Pythonie, co nie było widoczne w przypadku tablic typu rank-2. Tam trzeba być ostrożnym, a uzyskanie takich samych wyników w tych dwóch językach wymagałoby więcej wstępnych uwarunkowań.
Zdaję sobie sprawę, że to rozumowanie może nie być ogólne, ale tylko do tego stopnia mógłbym się nad tym zastanowić. Miejmy nadzieję, że zachęci to innych kolegów do poddania go trudniejszej próbie.
źródło
Poznaj zarówno
tile
irepeat
.źródło
numpy.matlib ma funkcję repmat z interfejsem podobnym do funkcji Matlab
źródło
źródło