Comme avec la plupart des symboles APL, ⍉a des significations différentes lorsqu'il est appelé avec un argument (transposition) contre deux arguments (dimensions de transposition / réorganisation dyadique). Ce défi concerne ce dernier, qui agit de manière similaire à numpy.moveaxisPython ou permuteMATLAB, mais est plus puissant.
order ⍉ Aquand ordera des entrées distinctes
Lorsque tous les membres de ordersont distincts, order ⍉ Aéquivaut à:
numpy.moveaxis(A, tuple(range(len(A.shape)), order)en Python, oupermute(A,order)dans MATLAB. Citant la documentation de ce dernier:
B = permute (A, ordre) réorganise les dimensions de A de sorte qu'elles soient dans l'ordre spécifié par l'ordre vectoriel. Le tableau B résultant a les mêmes valeurs que A mais l'ordre des indices nécessaires pour accéder à un élément particulier est réorganisé comme spécifié par la commande.
Par exemple, supposons qu'il As'agit d'un tableau 3D et laissez B ← (2 0 1)⍉A. Alors B est tel que B[x0,x1,x2] = A[x2,x0,x1]pour tousx2,x0,x1
order ⍉ Aquand ordera des entrées répétées
Quand ordera des entrées répétées, nous prenons une tranche diagonale du tableau. Par exemple, soit A un tableau 2x3x4. B ← (0 0 1)⍉Aprend une tranche diagonale Apour créer une Btelle chose B[x0,x1] = A[x0,x0,x1]. Notez qu'il Bs'agit d'un tableau 2x4: s'il était 3x4, nous aurions besoin de définir B[2, x1] = A[2, 2, x1]ce qui serait hors limites A. En général, la ke dimension de Bsera le minimum de tout A.shape[i]cela order[i] = k.
Exemple
Considérons la transposition dyadique order⍉Aoù order = [2, 1, 0]et A est 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]]]
Le résultat est le tableau 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]]]
Notez que lorsque, par exemple, (x0, x1, x2) = (4,1,2) nous avons B[x0,x1,x2] = A[x2, x1, x0] = A[2,1,4] = 49.
Si , au contraire order = [0, 0, 0]et Acomme ci - dessus, nous aurions la sortie Bsoit le tableau de taille 3 1 dimensions de B = [0, 26, 52]sorte queB[1] = B[x0] = A[x0,x0,x0] = A[1,1,1] = 26
Contribution
Ici, nous utilisons l'indexation 0, mais vous pouvez également utiliser l'indexation 1 comme c'est la valeur par défaut APL.
Un tableau multidimensionnel ou imbriqué
A, de dimension n ≥ 1.Une liste
orderde n entiers positifs constitués des entiers {0,1, ..., k} (ou {1, ..., k + 1} pour 1-index) pour certains k < n , dans n'importe quel ordre, éventuellement avec répétitions.
Production
- Un tableau multidimensionnel ou imbriqué représentant le résultat de l'application de la transposition dyadique avec ces arguments. (La sortie aura la dimension k + 1. )
Vous pouvez écrire un programme complet, une fonction, etc., comme le permet la norme actuelle sur la méta.
Si votre langue a une fonction intégrée, il est recommandé d'écrire également une solution sans la fonction intégrée pour une réponse intéressante.
Cas de test
Référence de l'implémentation Python à venir.
Remarque pour la lecture des cas de test: dans APL, l'avant-dernier et l'axe ultime d'un tableau se trouvent le long des colonnes et des lignes dans cet ordre.
⍉qui utilise les indices d'axe inversés par défaut, c'est donc ⍉Ala même chose que (2 1 0)⍉Asi Aest un tableau à 3 dimensions et en général l' ⍉Aest (⌽⍳≢⍴A)⍉A.
[number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element].
⍉P