使用#(复制)作为二维数组的选择或过滤器
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
但请求的轴必须用 0
s(或 !.
)填充以保持正确的形状:
(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"吗?你用 0
s 替换吗?结构对结果重要吗?
例如,如果您只需要 "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
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
但请求的轴必须用 0
s(或 !.
)填充以保持正确的形状:
(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"吗?你用 0
s 替换吗?结构对结果重要吗?
例如,如果您只需要 "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