使用#(复制)作为二维数组的选择或过滤器

Use # (Copy) as selection or filter on 2-d array

J原语Copy(#)可以作为过滤函数,如

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

基本上就是

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

问题是如果 # 的右边是二维或更高阶的形状数组,如何使用 # 进行选择,如果可能的话。例如:

k =: 2 4 $ i.8

(k > 3) # k

我得到了length error

做出这样的选择的正确方法是什么?

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

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

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

(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,因为现在您有了一个结构。你如何丢弃价值观?你留空"cells"吗?你用 0s 替换吗?结构对结果重要吗?

例如,如果您只需要 "values where",那么只需整理 , 数组:

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

如果你需要"replace where",那么你可以使用修改}:

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