【问题标题】:How do I convert a vector of triplets to a 3xnx3 matrix in Dyalog APL?如何在 Dyalog APL 中将三元组向量转换为 3xnx3 矩阵?
【发布时间】:2020-10-19 10:00:12
【问题描述】:

我有一个包含 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

它可以满足我的需求——但我可以直接对矢量进行整形吗?

【问题讨论】:

    标签: multidimensional-array vector reshape apl dyalog


    【解决方案1】:

    解决方案

    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
    

    现在我们需要交换前两个轴。这可以使用二元转置函数(对于我们的用例)可以被认为是“重新排序轴”函数。 left 参数是一个数组,其中包含您希望相应轴移动的位置(第一个元素定义第一个轴的最终位置,依此类推)。虽然轴的正常索引是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
    

    【讨论】:

      猜你喜欢
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 2013-11-21
      • 1970-01-01
      相关资源
      最近更新 更多