Як і у більшості символів APL, він ⍉
має різний зміст, коли викликається одним аргументом (транспоніровать) проти двох аргументів (діадичний розмір переміщення / зміни порядку). Ця проблема стосується останнього, який діє аналогічно numpy.moveaxis
в Python або permute
MATLAB, але є більш потужним.
order ⍉ A
коли order
має чіткі записи
Коли всі члени команди order
є різними, order ⍉ A
рівнозначно:
numpy.moveaxis(A, tuple(range(len(A.shape)), order)
в Python, абоpermute(A,order)
в MATLAB. Цитуючи з документації останнього:
B = перестановка (A, порядок) переставляє розміри A так, щоб вони були в порядку, визначеному порядком вектора. В результаті масив B має ті самі значення, що і A, але порядок підписок, необхідний для доступу до будь-якого конкретного елемента, переставляється, як зазначено в порядку.
Наприклад, припустимо A
, це 3D-масив, і нехай B ← (2 0 1)⍉A
. Тоді Б такий, що B[x0,x1,x2] = A[x2,x0,x1]
для всіхx2,x0,x1
order ⍉ A
коли order
є повторні записи
Після order
повторних записів ми беремо діагональний фрагмент масиву. Наприклад, нехай A - масив 2x3x4. B ← (0 0 1)⍉A
займає діагональний зріз уздовж, A
щоб створити B
таке, що B[x0,x1] = A[x0,x0,x1]
. Зауважте, що B
це масив 2x4: якби він був 3x4, нам потрібно було б встановити, B[2, x1] = A[2, 2, x1]
який би не виходив за межі A
. Загалом, цей k
вимір B
буде мінімальним для всіх A.shape[i]
таких order[i] = k
.
Приклад
Розглянемо діадичний транспозит, order⍉A
де order = [2, 1, 0]
і 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]]]
Результат - масив 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]]]
Зауважимо, що коли, наприклад, (x0, x1, x2) = (4,1,2) у нас є B[x0,x1,x2] = A[x2, x1, x0] = A[2,1,4] = 49
.
Якщо замість цього order = [0, 0, 0]
і A
як зазначено вище, тоді у нас виведенням B
буде одновимірний масив розміру-3, B = [0, 26, 52]
так щоB[1] = B[x0] = A[x0,x0,x0] = A[1,1,1] = 26
Вхідні дані
Тут ми використовуємо 0-індексацію, але ви також можете використовувати 1-індексацію, як це за замовчуванням APL.
Багатовимірний або вкладений масив
A
розмірності n ≥ 1.Список
order
з п позитивних цілих чисел , що складаються з цілих чисел {0,1, ..., K} (або {1, ..., K + 1} для 1-індексу) для деякого до < п , в будь-якому порядку, можливо , з повторами.
Вихідні дані
- Багатовимірний або вкладений масив, що представляє результат застосування діадичного транспозиту з цими аргументами. (Вихід матиме розмірність k + 1. )
Ви можете написати повну програму, функцію тощо, як це дозволено чинним стандартом на мета.
Якщо у вашій мові є вбудований, рекомендується також написати рішення без вбудованого заради цікавої відповіді.
Тестові справи
Реалізація довідкового Python незабаром.
Примітка для читання тестових випадків: в APL передостання і кінцева осі масиву розташовані уздовж стовпців і рядків у такому порядку.
⍉
що використовуються як за замовчуванням індекси оберненої осі, так ⍉A
само, як (2 1 0)⍉A
якщо б A
це тривимірний масив і взагалі ⍉A
є (⌽⍳≢⍴A)⍉A
.
[number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element]
.
⍉
P