Podobnie jak w przypadku większości symboli APL, ⍉
ma różne znaczenia, gdy wywoływany jest z jednym argumentem (transpozycja) w porównaniu z dwoma argumentami (wymiary transponowania / zmiany kolejności). To wyzwanie dotyczy tego drugiego, który działa podobnie do numpy.moveaxis
Pythona lub permute
MATLAB, ale ma większą moc.
order ⍉ A
kiedy order
ma wyraźne wpisy
Gdy wszyscy członkowie order
są odrębni, order ⍉ A
jest to równoważne z:
numpy.moveaxis(A, tuple(range(len(A.shape)), order)
w Pythonie lubpermute(A,order)
w MATLAB. Cytowanie z dokumentacji tego ostatniego:
B = permute (A, kolejność) przestawia wymiary A, tak aby były w kolejności określonej przez kolejność wektorów. Wynikowa tablica B ma takie same wartości jak A, ale kolejność indeksów dolnych potrzebnych do uzyskania dostępu do dowolnego konkretnego elementu jest zmieniana zgodnie z kolejnością.
Załóżmy na przykład, że A
jest to tablica 3D i let B ← (2 0 1)⍉A
. Zatem B jest takie, że B[x0,x1,x2] = A[x2,x0,x1]
dla wszystkichx2,x0,x1
order ⍉ A
kiedy order
powtórzył wpisy
Po order
powtórzeniu wpisów bierzemy przekątną tablicę. Na przykład niech A będzie tablicą 2x3x4. B ← (0 0 1)⍉A
bierze ukośny kawałek, A
aby utworzyć B
taki B[x0,x1] = A[x0,x0,x1]
. Zauważ, że B
jest to tablica 2x4: gdyby była to 3x4, musielibyśmy ustawić, B[2, x1] = A[2, 2, x1]
która byłaby poza zakresem A
. Ogólnie rzecz biorąc, ten k
wymiar B
będzie minimum wszystkich A.shape[i]
takich, które order[i] = k
.
Przykład
Rozważmy transpozycję dyadyczną order⍉A
gdzie order = [2, 1, 0]
i A to 3x4x5
A =
[[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
[[20 21 22 23 24]
[25 26 27 28 29]
[30 31 32 33 34]
[35 36 37 38 39]]
[[40 41 42 43 44]
[45 46 47 48 49]
[50 51 52 53 54]
[55 56 57 58 59]]]
Wynikiem jest tablica 5x4x3 B =
[[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
[[ 1 21 41]
[ 6 26 46]
[11 31 51]
[16 36 56]]
[[ 2 22 42]
[ 7 27 47]
[12 32 52]
[17 37 57]]
[[ 3 23 43]
[ 8 28 48]
[13 33 53]
[18 38 58]]
[[ 4 24 44]
[ 9 29 49]
[14 34 54]
[19 39 59]]]
Zauważ, że gdy np. (X0, x1, x2) = (4,1,2) mamy B[x0,x1,x2] = A[x2, x1, x0] = A[2,1,4] = 49
.
Jeśli zamiast tego order = [0, 0, 0]
i A
jak wyżej, otrzymalibyśmy wynik B
w postaci 1-wymiarowej tablicy rozmiar-3, B = [0, 26, 52]
aby takB[1] = B[x0] = A[x0,x0,x0] = A[1,1,1] = 26
Wejście
W tym przypadku korzystamy z indeksowania 0, ale można również stosować indeksowanie 1, tak jak domyślna wartość APL.
Wielowymiarowa lub zagnieżdżona tablica
A
o wymiarze n ≥ 1.Lista
order
z n dodatnich liczb całkowitych, składająca się z liczb całkowitych {0,1, ..., K} (i {1, ..., k + 1} 1-index) dla niektórych k < n , w dowolnej kolejności, ewentualnie z powtórzeniami.
Wynik
- Wielowymiarowa lub zagnieżdżona tablica reprezentująca wynik zastosowania transpozycji dyadycznej z tymi argumentami. (Dane wyjściowe będą miały wymiar k + 1 ).
Możesz napisać pełny program, funkcję itp., Zgodnie z obowiązującym standardem na meta.
Jeśli Twój język ma wbudowaną wersję, zachęcamy do napisania rozwiązania bez wbudowanej wersji w celu uzyskania interesującej odpowiedzi.
Przypadki testowe
Dokumentacja implementacji języka Python już wkrótce.
Uwaga do czytania przypadków testowych: w APL przedostatnia i ostateczna oś tablicy są wzdłuż kolumn i wierszy w tej kolejności.
⍉
które domyślnie wykorzystuje indeksy odwróconej osi, więc ⍉A
jest to to samo, co (2 1 0)⍉A
jeśli A
jest trójwymiarową tablicą i ogólnie ⍉A
jest (⌽⍳≢⍴A)⍉A
.
[number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element]
.
⍉
P