Çoğu APL sembolünde olduğu gibi, ⍉
bir argümanla (devrik) çağrıldığında iki argümanla (ikili devrik / yeniden sıralama boyutları) çağrıldığında farklı anlamlar vardır. Bu zorluk numpy.moveaxis
, Python veya permute
MATLAB'da benzer şekilde hareket eden ancak daha güçlü olan ikincisi ile ilgilidir .
order ⍉ A
ne zaman order
farklı girişler var
Tüm üyeleri order
farklı olduğunda order ⍉ A
, şuna eşittir:
numpy.moveaxis(A, tuple(range(len(A.shape)), order)
Python'da veyapermute(A,order)
MATLAB. İkincisinin belgelerinden alıntı :
B = permute (A, order), A'nın boyutlarını vektör sırası tarafından belirtilen sırada olacak şekilde yeniden düzenler. Elde edilen B dizisi A ile aynı değerlere sahiptir, ancak herhangi bir belirli öğeye erişmek için gereken aboneliklerin sırası, siparişte belirtildiği gibi yeniden düzenlenir.
Örneğin, diyelim A
ki bir 3B dizi ve diyelim B ← (2 0 1)⍉A
. O zaman B öyle ki B[x0,x1,x2] = A[x2,x0,x1]
, herkes içinx2,x0,x1
order ⍉ A
order
tekrarlanan girişler ne zaman
order
Tekrarlanan girişler olduğunda , dizinin çapraz dilimini alırız. Örneğin, A 2x3x4 dizisi olsun. böyle B ← (0 0 1)⍉A
çapraz bir dilim A
oluşturur . Bir 2x4 dizisi olduğunu unutmayın : 3x4 olsaydı, sınırlarının dışında olacağını ayarlamamız gerekirdi . Genel olarak bunun boyutu , tüm bu boyutların en azı olacaktır .B
B[x0,x1] = A[x0,x0,x1]
B
B[2, x1] = A[2, 2, x1]
A
k
B
A.shape[i]
order[i] = k
Misal
A'nın 3x4x5 order⍉A
olduğu ikili order = [2, 1, 0]
devri düşünün
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]]]
Sonuç 5x4x3 dizisi 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]]]
Örneğin, (x0, x1, x2) = (4,1,2) 'e sahip olduğumuzu unutmayın B[x0,x1,x2] = A[x2, x1, x0] = A[2,1,4] = 49
.
Bunun yerine order = [0, 0, 0]
ve A
yukarıdaki gibi, o zaman çıktı B
1 boyutlu boyut-3 dizi olacaktı B = [0, 26, 52]
kiB[1] = B[x0] = A[x0,x0,x0] = A[1,1,1] = 26
Giriş
Burada 0-endeksleme kullanıyoruz, ancak APL varsayılanı olarak 1-endeksleme de kullanabilirsiniz.
N ≥ 1
A
boyutunda çok boyutlu veya iç içe dizi .Bir liste
order
ait n tamsayılar oluşan pozitif tamsayılar {0,1, ..., k} (veya {1, ..., k + 1} 1-endeksi için) bazıları için k < n muhtemelen herhangi bir sırada, tekrarlamalarla.
Çıktı
- Bu argümanlarla ikili dönüşümün uygulanmasının sonucunu temsil eden çok boyutlu veya iç içe dizi. (Çıktı k + 1 boyutuna sahip olacaktır .)
Mevcut standardın metada izin verdiği şekilde tam bir program, işlev vb. Yazabilirsiniz.
Dilinizde bir yerleşik varsa, ilginç bir cevap uğruna yerleşik olmadan bir çözüm yazmanız da önerilir.
Test senaryoları
Referans Python uygulaması yakında.
Test senaryolarını okumak için not: APL'de, bir dizinin sondan bir önceki ve son eksenleri bu sırayla sütunlar ve satırlar boyunca bulunur.
⍉
, böylece varsayılan olarak ters eksen indisleri kullanan ⍉A
aynı (2 1 0)⍉A
ise A
bir 3-boyutlu bir dizidir ve genel olarak ⍉A
ise (⌽⍳≢⍴A)⍉A
.
[number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element]
.
⍉
P