如何在 Dyalog APL 中将三元组向量转换为 3xnx3 矩阵?
How do I convert a vector of triplets to a 3xnx3 matrix in Dyalog APL?
我有一个包含 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
哪个可以满足我的要求 -- 但我可以直接塑造矢量吗?
解决方案
1 0 2 ⍉ (9÷⍨≢data) 3 3 ⍴ data
说明
通过使用 ⍳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
最终的形状显然是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
换句话说,我们的工作就是调换前两个坐标轴的填充顺序。为此,我们按照我们希望填充的顺序列出轴长度:
(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
现在我们需要交换前两个轴。这可以使用二元转置函数 ⍉
实现,它(对于我们的用例)可以被认为是“重新排序轴”函数。左边的参数是一个数组,其中包含您希望相应轴到达的位置(第一个元素定义第一个轴的最终位置,依此类推)。虽然轴的正常索引是 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
我有一个包含 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
哪个可以满足我的要求 -- 但我可以直接塑造矢量吗?
解决方案
1 0 2 ⍉ (9÷⍨≢data) 3 3 ⍴ data
说明
通过使用 ⍳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
最终的形状显然是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
换句话说,我们的工作就是调换前两个坐标轴的填充顺序。为此,我们按照我们希望填充的顺序列出轴长度:
(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
现在我们需要交换前两个轴。这可以使用二元转置函数 ⍉
实现,它(对于我们的用例)可以被认为是“重新排序轴”函数。左边的参数是一个数组,其中包含您希望相应轴到达的位置(第一个元素定义第一个轴的最终位置,依此类推)。虽然轴的正常索引是 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