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.moveaxis
Python ou permute
MATLAB, mais est plus puissant.
order ⍉ A
quand order
a des entrées distinctes
Lorsque tous les membres de order
sont 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 A
s'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 ⍉ A
quand order
a des entrées répétées
Quand order
a 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)⍉A
prend une tranche diagonale A
pour créer une B
telle chose B[x0,x1] = A[x0,x0,x1]
. Notez qu'il B
s'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 k
e dimension de B
sera le minimum de tout A.shape[i]
cela order[i] = k
.
Exemple
Considérons la transposition dyadique order⍉A
où 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 A
comme ci - dessus, nous aurions la sortie B
soit 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
order
de 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 ⍉A
la même chose que (2 1 0)⍉A
si A
est un tableau à 3 dimensions et en général l' ⍉A
est (⌽⍳≢⍴A)⍉A
.
[number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element]
.
⍉
P