Trasposizione diadica


9

Come con la maggior parte dei simboli APL, ha significati diversi quando viene chiamato con un argomento (trasposizione) rispetto a due argomenti (dimensioni diadiche di trasposizione / riordino). Questa sfida riguarda quest'ultima, che agisce in modo simile a numpy.moveaxisPython o permuteMATLAB, ma è più potente.

order ⍉ Aquando orderha voci distinte

Quando tutti i membri di ordersono distinti, order ⍉ Aequivale a:

  • numpy.moveaxis(A, tuple(range(len(A.shape)), order) in Python o
  • permute(A,order)in MATLAB. Citando dalla documentazione di quest'ultimo:

B = permute (A, order) riorganizza le dimensioni di A in modo che siano nell'ordine specificato dall'ordine vettoriale. L'array B risultante ha gli stessi valori di A, ma l'ordine dei pedici necessari per accedere a un particolare elemento viene riordinato come specificato dall'ordine.

Ad esempio, supponiamo che Asia un array 3D e let B ← (2 0 1)⍉A. Quindi B è tale che B[x0,x1,x2] = A[x2,x0,x1]per tuttix2,x0,x1

order ⍉ Aquando orderha ripetute voci

Quando orderha ripetute voci, prendiamo una sezione diagonale dell'array. Ad esempio, sia A un array 2x3x4. B ← (0 0 1)⍉Aprende una fetta diagonale Aper creare Btale B[x0,x1] = A[x0,x0,x1]. Si noti che Bè un array 2x4: se fosse 3x4, avremmo bisogno di impostare B[2, x1] = A[2, 2, x1]quale sarebbe fuori dai limiti A. In generale, la kdimensione di Bsarà il minimo di tutto A.shape[i]ciò che order[i] = k.

Esempio

Considera la trasposizione diadica order⍉Adove order = [2, 1, 0]e A è 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]]]

Il risultato è l'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]]]

Si noti che quando, ad esempio, (x0, x1, x2) = (4,1,2) abbiamo B[x0,x1,x2] = A[x2, x1, x0] = A[2,1,4] = 49.

Se invece order = [0, 0, 0]e Acome sopra, allora avremmo l'output Bcome l'array size-3 monodimensionale in B = [0, 26, 52]modo cheB[1] = B[x0] = A[x0,x0,x0] = A[1,1,1] = 26

Ingresso

Qui utilizziamo l'indicizzazione 0, ma puoi anche utilizzare l'indicizzazione 1 come impostazione predefinita APL.

  • Un array multidimensionale o nidificato A, di dimensione n ≥ 1.

  • Un elenco orderdi n numeri interi positivi costituiti da numeri interi {0,1, ..., k} (o {1, ..., k + 1} per 1 indice) per alcuni k < n , in qualsiasi ordine, possibilmente con ripetizioni.

Produzione

  • Un array multidimensionale o nidificato che rappresenta il risultato dell'applicazione della trasposizione diadica con tali argomenti. (L'output avrà dimensione k + 1. )

È possibile scrivere un programma completo, una funzione, ecc. Come consentito dallo standard corrente su meta.

Se la tua lingua ha un builtin, si consiglia di scrivere anche una soluzione senza il builtin per il bene di una risposta interessante.

Casi test

Casi di prova su TIO

L'implementazione di Python di riferimento sarà presto disponibile.

Nota per la lettura dei casi di test: in APL, il penultimo e ultimo asse di un array è lungo colonne e righe in quell'ordine.


4
APL, 1 byte:: P
Quintec,

1
In realtà, molti simboli APL usano solo un secondo argomento predefinito quando vengono chiamati con un argomento. Ciò include quale utilizza gli indici degli assi inversi come impostazione predefinita, quindi ⍉Aè lo stesso di (2 1 0)⍉Ase si Atratta di un array tridimensionale e in generale lo ⍉Aè (⌽⍳≢⍴A)⍉A.
Adám,

@lirtosiast domanda su I / O: una matrice multidimensionale può essere rappresentata come una coppia di forma (elenco di dimensioni) e contenuto (tutti gli elementi in ordine lessicografico dei loro indici)?
ngn,

@ngn Direi di no per ora, ma dovresti chiedere su meta se quel formato è accettabile per impostazione predefinita.
Lirtosiast

@lirtosiast Aneddoticamente, Dyalog APL archivia internamente array come [number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element].
Adám,

Risposte:


4

APL (Dyalog Unicode) , SBCS da 34 byte

Questo è il codice del mio collega (leggermente modificato da Roger Hui : A History of APL in 50 Functions , capitolo 30 ), pubblicato con il permesso esplicito.

Lambda infix tacito anonimo (può essere utilizzato come drop-in per ).

{⍵[(⊂⊂⍺)⌷¨,¨⍳⍺[⍋⍺]{⌊/⍵}⌸(⍴⍵)[⍋⍺]]}

Provalo online!

{... } dfn; è l'argomento di sinistra (assi), è l'argomento di destra (matrice)
Eg [2,2,1]e[[[1,2],[3,4]]]

⍵[... ] indicizza l'array con:

  (⍴⍵)[... ] la forma (lunghezze degli assi) dell'array, indicizzata da:
  [1,2,2]

   ⍋⍺ il vettore di classificazione (gli indici che li ordinerebbero) degli assi
   [3,1,2]
  [2,1,2]

  ⍺[⍋⍺]{}⌸ Usa gli assi ordinati come chiavi per raggruppare quello, e per ogni gruppo:
  [1,2,2]{"1":[2],"2":[1,2]}

   {⌊/⍵} trova la lunghezza dell'asse più bassa
   {"1":2,"2":1}[2,1]

   generare gli indici in un sistema cartesiano di quelle dimensioni
  [[[1,1]],[[2,1]]]

   assicurarsi che gli indici di ciascuna coordinata sia un vettore (sarebbe scalare se è un vettore)
  [[[1,1]],[[2,1]]]

  (... )⌷¨ indice in ciascuno di quelli con il seguente:

   ⊂⊂⍺ gli assi (doppiamente racchiusi; una volta per selezionare quelle celle lungo il primo e unico asse, e una volta per ¨accoppiare ciascun vettore a destra con l'intero insieme di assi a sinistra)
   2 1 2
  [[[1,1,1]],[[1,2,1]]]
[[1],[3]]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.