Transpose diad

9

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.moveaxisdi Python atau permutedi MATLAB, tetapi lebih kuat.

order ⍉ Aketika ordermemiliki entri yang berbeda

Ketika semua anggota orderberbeda, order ⍉ Asetara dengan:

  • numpy.moveaxis(A, tuple(range(len(A.shape)), order) dalam Python, atau
  • permute(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 Aarray 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 ⍉ Akapan orderentri berulang

Ketika orderentri berulang, kami mengambil potongan diagonal array. Sebagai contoh, misalkan A menjadi array 2x3x4. B ← (0 0 1)⍉ADibutuhkan irisan diagonal Auntuk membuat Bitu B[x0,x1] = A[x0,x0,x1]. Perhatikan bahwa Barray 2x4: jika itu adalah 3x4, kita perlu mengatur B[2, x1] = A[2, 2, x1]yang akan keluar dari batas A. Secara umum kdimensi th Bakan menjadi minimum dari semua A.shape[i]itu order[i] = k.

Contoh

Pertimbangkan diad transpos di order⍉Amana 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 Aseperti di atas, maka kita akan memiliki output Bmenjadi 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 orderdari 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

Uji kasus pada TIO

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.

lirtosiast
sumber
4
APL, 1 byte:: P
Quintec
1
Sebenarnya, banyak simbol APL hanya menggunakan argumen kedua default ketika dipanggil dengan satu argumen. Ini termasuk yang menggunakan indeks sumbu terbalik sebagai default, jadi ⍉Asama seperti (2 1 0)⍉Ajika Aarray 3 dimensi dan secara umum ⍉Aadalah (⌽⍳≢⍴A)⍉A.
Adám
@lirtosiast pertanyaan tentang i / o: dapatkah array multidimensi direpresentasikan sebagai pasangan bentuk (daftar dimensi) dan konten (semua elemen dalam urutan leksikografis indeks mereka)?
ngn
@ Ngn Saya akan mengatakan tidak untuk saat ini, tetapi Anda harus bertanya pada meta apakah format itu dapat diterima secara default.
lirtosiast
@ lirtosiast Anecdotally, Dyalog APL secara internal menyimpan array sebagai [number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element].
Adám

Jawaban:

4

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]]

Adm
sumber