用jsoftware动词替换数组中的项目

时间:2019-02-15 13:57:01

标签: j

这里是使用I.动词来替换1级列表的简单方法

y=: _3 _2 _1 1 2 3
0 (I. y<0) } y

结果是

0 0 0 1 2 3 

问题是,例如,如何对2级矩阵进行这种替换

y2 =: 2 3 $ _3 _2 _1 1 2 3
0 (I. y2<0) } y2

我得到(J806)

|index error
|   0    (I.y2<2)}y2

原因似乎是

(I. y2 < 0)

给予

0 1 2
0 0 0

}

不好

2 个答案:

答案 0 :(得分:4)

此问题的最简单答案是使用二元>.Larger of)...

   0 >. y2
0 0 0
1 2 3

如果您想使用更通用的条件替换条件,则以下表格可能会有用:

   (0 > y2)} y2 ,: 0
0 0 0
1 2 3

如果您希望将其用作动词,则可以使用gerund形式(v1`v2)} y ↔ (v1 y)} (v2 y)

   (0 > ])`(0 ,:~ ])} y2
0 0 0
1 2 3

如果您的问题更多地与分散索引替换有关,那么这也是可能的。您需要获取要替换位置的2D索引,例如:

   4 $. $. 0 > y2
0 0
0 1
0 2

现在将这些索引框并使用二元}

   0 (<"1 (4 $. $. 0 > y2)) } y2
0 0 0
1 2 3

同样,您可以使用二元}x (v0`v1`v2)} y ↔ (x v0 y) (x v1 y)} (x v2 y))的gerund left参数将其变成动词,如下所示:

   0  [`([: (<"1) 4 $. [: $. 0 > ])`]} y2
0 0 0
1 2 3

   100 101 102  [`([: (<"1) 4 $. [: $. 0 > ])`]} y2
100 101 102
  1   2   3

要对此进行整理,可以将getIdx定义为单独的动词...

   getIdx=: 4 $. $.
   0 [`([: <"1@getIdx 0 > ])`]} y2
0 0 0
1 2 3

答案 1 :(得分:3)

这不是一个好的解决方案。我最初的方法是更改​​测试的排名,以便分别查看每一行,但这在一般情况下不起作用(请参阅下面的评论)。

 [y2 =: 2 3 $ _3 _2 _1 1 2 3  
_3 _2 _1
 1  2  3


   I. y2<0
0 1 2
0 0 0


   0 (I. y2<0)"1 } y2  NB. Rank of 1 applies to each row of y2
0 0 0
1 2 3