如何在 Dyalog APL 中将三元组向量转换为 3xnx3 矩阵?

xpq*_*pqz 4 vector apl multidimensional-array dyalog reshape

我有一个包含 9000 个整数元素的向量,其中每组 9 有 3 个我想分开的子组,从而产生一个形状为 3 1000 3 的矩阵。这是我所做的:

?IO?0
m?(9÷??data) 9?data
a?m[;0 1 2]
b?m[;3 4 5]
c?m[;6 7 8]
d??a b c
Run Code Online (Sandbox Code Playgroud)

哪个做我想要的 - 但我可以直接塑造矢量吗?

ab5*_*act 5

解决方案

1 0 2 ? (9÷??data) 3 3 ? data
Run Code Online (Sandbox Code Playgroud)

解释

通过使用?45占位符数据,我们可以看到它的意图:

      data ? ?45
      a?m[;0 1 2]
      b?m[;3 4 5]
      c?m[;6 7 8]
      d??a b c
      d
 0  1  2
 9 10 11
18 19 20
27 28 29
36 37 38

 3  4  5
12 13 14
21 22 23
30 31 32
39 40 41

 6  7  8
15 16 17
24 25 26
33 34 35
42 43 44
Run Code Online (Sandbox Code Playgroud)

最终的形状显然是3 (9÷??data) 3,但我们首先从每一层填充一行,然后从每一层填充第二行,依此类推。将此与正常的填充方式进行比较;第一层的所有行,然后是第二层的所有行,依此类推:

      3 (9÷??data) 3?data
 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
Run Code Online (Sandbox Code Playgroud)

换句话说,我们的工作是交换前两个轴的填充顺序。为此,我们按照希望填充的顺序列出轴长度:

      (9÷??data) 3 3?data
 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
Run Code Online (Sandbox Code Playgroud)

现在我们需要交换前两个轴。这可以使用二元转置函数?(对于我们的用例)可以被认为是“重新排序轴”函数。左边的参数是一个你想要相应轴去哪里的数组(第一个元素定义第一个轴的最终位置,依此类推)。虽然轴的正常索引是 ,但0 1 2我们可以用 交换前两个轴1 0 2

因此1 0 2 ? (9÷??data) 3 3 ? data采取我们的(9÷??data) 3 3形状并将其放入所需的形状3 (9÷??data) 3

    d ? 1 0 2 ? (9÷??data) 3 3 ? data
1
Run Code Online (Sandbox Code Playgroud)