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
进行这种选择的正确方法是什么?
答案 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