FAQ > 金融建模 > 建模问题 > 数组操作

Q:通过t[:,:]方式进行数组重构时可能引发错位的问题    

  • A:在一些编程场景中,我们可能用到t[:,:]:=R;方式对R进行重构处理,比如重构行列下标等,一般情况下这种是可以实现的。
    但是也存在一些特殊情况,该种方式可能会产生隐晦的错位问题。
    如:源数据可能通过各种过程产生,其每行数据的每列赋值顺序可能不一样,导致最终数据源码如下:存在个别行中列的实际存储顺序与其它行的顺序不一样
    R:=array("6.51":("price":6.51,"volumn":63700),
      "5.99":("price":5.99,"volumn":17000),
      "6.07":("volumn":20000,"price":6.07)
    );

    该数据在客户端中显示如:行列对齐,完全看不出差异,做正常的数组操作运算也没有任何问题


    但是在通过t[:,:]:=R;方式对该数据进行重构时(原目的是为了去掉行下标),产生列数据错位,展示如下:
      R:=array("6.51":("price":6.51,"volumn":63700),
      "5.99":("price":5.99,"volumn":17000),
      "6.07":("volumn":20000,"price":6.07));
      t := zeros(mrows(R),mcols(R,1));
      t[:,:]:=R;
      return t;

    结果如下:第三行的两列数据明显已经错位


    原因:天软中数组的数据按行进行存储,R记录的是数据最源始的存储状态,在通过t[:,:]方式赋值时,已经是不考虑t与R下标是否对应的关系,只是将R的元素按位置顺序赋值给t了,所以产生了这种错误效果。

    那么,对于这种场景我们应该怎么避免呢?
    建议在重构时,我们选择以下方式进行:
    示例1:利用ReIndex2函数修改数组行标或列标为自然数字
    ReIndex2函数说明:FAQ:ReIndex2
    R:=array("6.51":("price":6.51,"volumn":63700),
      "5.99":("price":5.99,"volumn":17000),
      "6.07":("volumn":20000,"price":6.07));
      return ReIndex2(R,1);

    返回结果:


    示例2:对源数据按指定列顺序进行重构后再进行该类操作
    R:=array("6.51":("price":6.51,"volumn":63700),
      "5.99":("price":5.99,"volumn":17000),
      "6.07":("volumn":20000,"price":6.07));
      R:=R[:,array("price","volumn")];//按指定列顺序重构
      t := zeros(mrows(R),mcols(R,1));
      t[:,:]:=R;
      return t;

    返回结果: