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 opermute(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
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.
⍉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.
[number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element].
⍉P