Como con la mayoría de los símbolos APL, ⍉
tiene diferentes significados cuando se llama con un argumento (transposición) versus dos argumentos (dimensiones de transposición / reordenación diádica). Este desafío se refiere a este último, que actúa de manera similar a numpy.moveaxis
Python o permute
MATLAB, pero es más poderoso.
order ⍉ A
cuando order
tiene entradas distintas
Cuando todos los miembros de order
son distintos, order ⍉ A
es equivalente a:
numpy.moveaxis(A, tuple(range(len(A.shape)), order)
en Python, opermute(A,order)
en MATLAB Citando de la documentación de este último:
B = permutar (A, orden) reorganiza las dimensiones de A para que estén en el orden especificado por el orden vectorial. La matriz B resultante tiene los mismos valores que A pero el orden de los subíndices necesarios para acceder a cualquier elemento en particular se reorganiza según lo especificado por orden.
Por ejemplo, supongamos que A
es una matriz 3D, y deja B ← (2 0 1)⍉A
. Entonces B es tal que B[x0,x1,x2] = A[x2,x0,x1]
para todosx2,x0,x1
order ⍉ A
cuando order
ha repetido entradas
Cuando order
ha repetido entradas, tomamos un corte diagonal de la matriz. Por ejemplo, deje que A sea una matriz de 2x3x4. B ← (0 0 1)⍉A
toma un corte diagonal A
para crear B
tal que B[x0,x1] = A[x0,x0,x1]
. Tenga en cuenta que B
es una matriz de 2x4: si fuera 3x4, tendríamos que establecer B[2, x1] = A[2, 2, x1]
cuál estaría fuera de los límites de A
. En general, la k
dimensión de B
será el mínimo de todo A.shape[i]
eso order[i] = k
.
Ejemplo
Considere la transposición diádica order⍉A
donde order = [2, 1, 0]
y A es 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]]]
El resultado es la matriz 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]]]
Tenga en cuenta que cuando, por ejemplo, (x0, x1, x2) = (4,1,2) tenemos B[x0,x1,x2] = A[x2, x1, x0] = A[2,1,4] = 49
.
Si, en cambio, order = [0, 0, 0]
y A
como se indica arriba, la salida B
sería la matriz 1-dimensional size-3 B = [0, 26, 52]
para queB[1] = B[x0] = A[x0,x0,x0] = A[1,1,1] = 26
Entrada
Aquí usamos la indexación 0, pero también puede usar la indexación 1 como es el valor predeterminado de APL.
Una matriz multidimensional o anidada
A
, de dimensión n ≥ 1.Una lista
order
de n enteros positivos que consiste en los enteros {0,1, ..., k} (o {1, ..., k + 1} para 1-index) para algunos k < n , en cualquier orden, posiblemente con repeticiones
Salida
- Una matriz multidimensional o anidada que representa el resultado de aplicar la transposición diádica con esos argumentos. (La salida tendrá dimensión k + 1. )
Puede escribir un programa completo, función, etc. según lo permitido por el estándar actual en meta.
Si su idioma tiene una función incorporada, se recomienda escribir también una solución sin la función incorporada en aras de una respuesta interesante.
Casos de prueba
La implementación de Python de referencia estará disponible próximamente.
Nota para leer casos de prueba: en APL, los ejes penúltimo y último de una matriz están a lo largo de columnas y filas en ese orden.
⍉
qué usa los índices de eje invertidos como predeterminados, por lo que ⍉A
es lo mismo que (2 1 0)⍉A
si se A
trata de una matriz tridimensional y, en general, ⍉A
es (⌽⍳≢⍴A)⍉A
.
[number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element]
.
⍉
P