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.
sumber
⍉
P⍉
yang menggunakan indeks sumbu terbalik sebagai default, jadi⍉A
sama seperti(2 1 0)⍉A
jikaA
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]
.Jawaban:
APL (Dyalog Unicode) , 34 byte SBCS
Ini adalah kode kolega saya (sedikit dimodifikasi dari Roger Hui : A History of APL in 50 Functions , bab 30 ), diposting dengan izin eksplisit.
Anonim tacit infix lambda (dapat digunakan sebagai drop-in untuk
⍉
).Cobalah online!
{
...}
dfn;⍺
argumen kiri (sumbu),⍵
argumen kanan (array)Eg
[2,2,1]
dan[[[1,2],[3,4]]]
⍵[
...]
indeks array dengan:(⍴⍵)[
...]
bentuk (panjang sumbu) array, diindeks oleh:[1,2,2]
⍋⍺
vektor gradasi (indeks yang akan mengurutkannya) dari sumbu[3,1,2]
[2,1,2]
⍺[⍋⍺]{
…}⌸
Gunakan sumbu yang diurutkan sebagai kunci untuk mengelompokkan itu, dan untuk setiap grup:[1,2,2]
→{"1":[2],"2":[1,2]}
{⌊/⍵}
temukan panjang sumbu terendah{"1":2,"2":1}
→[2,1]
⍳
menghasilkan indeks dalam sistem Kartesius dari dimensi-dimensi itu[[[1,1]],[[2,1]]]
,¨
memastikan bahwa indeks masing-masing koordinat adalah vektor (akan skalar jika⍵
merupakan vektor)[[[1,1]],[[2,1]]]
(
...)⌷¨
indeks masing-masing dengan yang berikut:⊂⊂⍺
sumbu (tertutup dua kali; satu untuk⌷
memilih sel-sel di sepanjang sumbu pertama dan satu-satunya, dan satu kali untuk¨
memasangkan setiap vektor di sebelah kanan dengan seluruh rangkaian sumbu di sebelah kiri)2 1 2
[[[1,1,1]],[[1,2,1]]]
[[1],[3]]
sumber