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.moveaxis
Python o permute
MATLAB, ma è più potente.
order ⍉ A
quando order
ha voci distinte
Quando tutti i membri di order
sono distinti, order ⍉ A
equivale 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 A
sia 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 ⍉ A
quando order
ha ripetute voci
Quando order
ha ripetute voci, prendiamo una sezione diagonale dell'array. Ad esempio, sia A un array 2x3x4. B ← (0 0 1)⍉A
prende una fetta diagonale A
per creare B
tale 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 k
dimensione di B
sarà il minimo di tutto A.shape[i]
ciò che order[i] = k
.
Esempio
Considera la trasposizione diadica order⍉A
dove 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 A
come sopra, allora avremmo l'output B
come 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
order
di 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)⍉A
se si A
tratta 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