Seperti kebanyakan simbol APL, ⍉
memiliki makna yang berbeda ketika dipanggil dengan satu argumen (transpose) versus dua argumen (dyadic transpose / reorder dimensi). Tantangan ini menyangkut yang terakhir, yang bertindak serupa dengan numpy.moveaxis
di Python atau permute
di MATLAB, tetapi lebih kuat.
order ⍉ A
ketika order
memiliki entri yang berbeda
Ketika semua anggota order
berbeda, order ⍉ A
setara dengan:
numpy.moveaxis(A, tuple(range(len(A.shape)), order)
dalam Python, ataupermute(A,order)
dalam MATLAB. Mengutip dari dokumentasi yang terakhir:
B = permute (A, order) mengatur ulang dimensi A sehingga mereka berada dalam urutan yang ditentukan oleh urutan vektor. Array yang dihasilkan B memiliki nilai yang sama dengan A tetapi urutan subskrip yang diperlukan untuk mengakses elemen tertentu diatur ulang seperti yang ditentukan oleh pesanan.
Misalnya, anggaplah A
array 3D, dan biarkan B ← (2 0 1)⍉A
. Maka B adalah sedemikian rupa B[x0,x1,x2] = A[x2,x0,x1]
untuk semuax2,x0,x1
order ⍉ A
kapan order
entri berulang
Ketika order
entri berulang, kami mengambil potongan diagonal array. Sebagai contoh, misalkan A menjadi array 2x3x4. B ← (0 0 1)⍉A
Dibutuhkan irisan diagonal A
untuk membuat B
itu B[x0,x1] = A[x0,x0,x1]
. Perhatikan bahwa B
array 2x4: jika itu adalah 3x4, kita perlu mengatur B[2, x1] = A[2, 2, x1]
yang akan keluar dari batas A
. Secara umum k
dimensi th B
akan menjadi minimum dari semua A.shape[i]
itu order[i] = k
.
Contoh
Pertimbangkan diad transpos di order⍉A
mana order = [2, 1, 0]
dan A adalah 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]]]
Hasilnya adalah array 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]]]
Perhatikan bahwa ketika, misalnya, (x0, x1, x2) = (4,1,2) yang kita miliki B[x0,x1,x2] = A[x2, x1, x0] = A[2,1,4] = 49
.
Jika sebaliknya order = [0, 0, 0]
dan A
seperti di atas, maka kita akan memiliki output B
menjadi array ukuran 1-dimensi B = [0, 26, 52]
sehinggaB[1] = B[x0] = A[x0,x0,x0] = A[1,1,1] = 26
Memasukkan
Di sini kami menggunakan pengindeksan 0, tetapi Anda juga dapat menggunakan pengindeksan 1 seperti standar APL.
Array multidimensi atau bersarang
A
, dengan dimensi n ≥ 1.Daftar
order
dari n bilangan bulat positif yang terdiri dari bilangan bulat {0,1, ..., k} (atau {1, ..., k + 1} untuk 1-index) untuk beberapa k < n , dalam urutan apapun, mungkin dengan pengulangan.
Keluaran
- Array multidimensi atau bersarang yang mewakili hasil dari penerapan transad diad dengan argumen-argumen tersebut. (Output akan memiliki dimensi k +1 .)
Anda dapat menulis program lengkap, fungsi, dll. Sebagaimana diizinkan oleh standar saat ini pada meta.
Jika bahasa Anda memiliki builtin, disarankan untuk juga menulis solusi tanpa builtin demi jawaban yang menarik.
Uji kasus
Referensi implementasi Python segera hadir.
Catatan untuk membaca test case: di APL, sumbu kedua dari belakang dan terakhir dari array ada di sepanjang kolom dan baris dalam urutan itu.
⍉
yang menggunakan indeks sumbu terbalik sebagai default, jadi ⍉A
sama seperti (2 1 0)⍉A
jika A
array 3 dimensi dan secara umum ⍉A
adalah (⌽⍳≢⍴A)⍉A
.
[number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element]
.
⍉
P