与大多数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 = permute(A,order)重新排列A的尺寸,以便它们按矢量顺序指定的顺序。所得数组B具有与A相同的值,但访问任何特定元素所需的下标顺序均按顺序指定进行重新排列。
例如,假设A
是一个3D数组,然后让B ← (2 0 1)⍉A
。那么B 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
的第N维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
为一维size-3数组,B = [0, 26, 52]
这样B[1] = B[x0] = A[x0,x0,x0] = A[1,1,1] = 26
输入项
在这里,我们使用0索引,但是您也可以使用1索引,这是APL默认设置。
多维或嵌套数组
A
的维数,Ñ ≥1。n个正整数的列表
order
,该整数由任意值k < n的整数{0,1,...,k}(或1索引的{1,...,k + 1})组成,可能以任何顺序重复。
输出量
- 多维或嵌套数组,表示对那些自变量应用二进转置的结果。(输出的尺寸为k + 1。)
您可以根据meta上的当前标准编写完整的程序,函数等。
如果您的语言具有内置功能,建议您也编写一个没有内置功能的解决方案,以便获得有趣的答案。
测试用例
参考Python实现即将推出。
阅读测试用例的注意事项:在APL中,数组的倒数第二个和最终轴按此顺序沿列和行排列。
⍉
其使用反相轴线指数为默认值,所以⍉A
是相同的(2 1 0)⍉A
,如果A
是3维阵列并且通常⍉A
是(⌽⍳≢⍴A)⍉A
。
[number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element]
。
⍉
P