使用#(复制)作为选择或对二维数组进行过滤

时间:2018-12-22 18:25:52

标签: j

J原语Copy#)可用作过滤器功能,例如

k =: i.8
(k>3) # k
4 5 6 7

基本上是

0 0 0 0 1 1 1 1 # i.8

问题是,如果#的右侧是2 d或更高秩的数组,那么如何使用#进行选择。例如:

k =: 2 4 $ i.8

(k > 3) # k

我得到了length error

进行这种选择的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

您可以使用适当的动词等级来获得类似二维选择的内容:

(2 | k) #"1 1 k
1 3
5 7

但请求的轴必须填充0(或!.)以保持正确的形状:

(k > 3) #("1 1) k
0 0 0 0
4 5 6 7

(k > 2) #("1 1) k
3 0 0 0
4 5 6 7

您必须为维度> 1更好地定义select,因为现在有了结构。您如何丢弃值?您是否保留空的“单元格”?您是否用0代替?结构对结果是否重要?

例如,如果仅需要“ values where”,则只需遍历,数组:

(,k > 2) # ,k
3 4 5 6 7

如果您需要“替换位置”,则可以使用修订}

u =: 5 :'I. , 5 >  y'     NB. indices where 5 > y
0 u } k
0 0 0 0
0 5 6 7

z =: 3 2 4 $ i.25
u =: 4 :'I. , (5 > y) +. (0 = 3|y)'     NB. indices where 5>y or 3 divides y
_999 u } z
_999 _999 _999 _999
_999    5 _999    7

  8 _999   10   11
_999   13   14 _999

 16   17 _999   19
 20 _999   22   23