Como na maioria dos símbolos de APL, ⍉
tem significados diferentes quando chamados com um argumento (transposição) versus dois argumentos (dimensões diádicas de transposição / reordenação). Esse desafio diz respeito ao último, que age de maneira semelhante ao numpy.moveaxis
Python ou permute
no MATLAB, mas é mais poderoso.
order ⍉ A
quando order
tem entradas distintas
Quando todos os membros de order
são distintos, order ⍉ A
é equivalente a:
numpy.moveaxis(A, tuple(range(len(A.shape)), order)
em Python oupermute(A,order)
em MATLAB. Citando a documentação deste último:
B = permuto (A, ordem) reorganiza as dimensões de A para que elas estejam na ordem especificada pela ordem do vetor. A matriz resultante B tem os mesmos valores que A, mas a ordem dos subscritos necessários para acessar qualquer elemento específico é reorganizada conforme especificado por ordem.
Por exemplo, suponha que A
seja uma matriz 3D e deixe B ← (2 0 1)⍉A
. Então B é tal que B[x0,x1,x2] = A[x2,x0,x1]
para todosx2,x0,x1
order ⍉ A
quando order
repetiu entradas
Quando order
tem entradas repetidas, pegamos uma fatia diagonal da matriz. Por exemplo, seja A uma matriz 2x3x4. B ← (0 0 1)⍉A
leva uma fatia diagonal A
para criar B
tal que B[x0,x1] = A[x0,x0,x1]
. Observe que B
é uma matriz 2x4: se fosse 3x4, precisaríamos definir B[2, x1] = A[2, 2, x1]
qual estaria fora dos limites de A
. Em geral, a k
th dimensão B
será o mínimo de tudo A.shape[i]
isso order[i] = k
.
Exemplo
Considere a transposição diádica order⍉A
onde 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]]]
O resultado é a 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]]]
Note que quando, por exemplo, (x0, x1, x2) = (4,1,2) temos B[x0,x1,x2] = A[x2, x1, x0] = A[2,1,4] = 49
.
Se, em vez disso, order = [0, 0, 0]
e A
acima, teríamos a saída B
como uma matriz tamanho-3 unidimensional, B = [0, 26, 52]
para queB[1] = B[x0] = A[x0,x0,x0] = A[1,1,1] = 26
Entrada
Aqui usamos a indexação 0, mas você também pode usar a indexação 1 como é o padrão da APL.
Uma matriz multidimensional ou aninhada
A
, de dimensão n ≥ 1.Uma lista
order
de n números inteiros positivos consistindo nos números inteiros {0,1, ..., k} (ou {1, ..., k + 1} para 1 índice) para alguns k < n , em qualquer ordem, possivelmente com repetições.
Resultado
- Uma matriz multidimensional ou aninhada que representa o resultado da aplicação da transposição diádica com esses argumentos. (A saída terá a dimensão k + 1. )
Você pode escrever um programa completo, função etc., conforme permitido pelo padrão atual no meta.
Se o seu idioma tiver um builtin, é recomendável também escrever uma solução sem o builtin para obter uma resposta interessante.
Casos de teste
Implementação do Python de referência em breve.
Nota para a leitura de casos de teste: no APL, os penúltimos e últimos eixos de uma matriz estão ao longo de colunas e linhas nessa ordem.
⍉
uso dos índices de eixo reverso como padrão, ⍉A
o mesmo que (2 1 0)⍉A
se A
for uma matriz tridimensional e, em geral, ⍉A
é (⌽⍳≢⍴A)⍉A
.
[number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element]
.
⍉
P