Warm tip: This article is reproduced from serverfault.com, please click

search-在J中使用向量/矩阵时,输出值及其关联的索引

(search - Print values and it's associated index when working with vectors / matrix in J)

发布于 2020-11-30 06:10:11

如果要检查向量或矩阵中有多少个值小于给定值,可以使用+ /(a <20)。但是,如果我想知道特定值及其索引,该怎么办?像(2(value)5(index))这样的表。我看着i。,i :(给出第一个和最后一个位置)和i。排序对你有帮助吗?

Questioner
user3234709
Viewed
11
Eelvex 2020-11-30 22:38:15

在J中非常常见的模式是从过滤器创建掩码,并在钩子或fork中对掩码数据进行操作和/或使用掩码数据:

((actions) (filter)) (data)

例如:

NB. Random array
a =: ? 20 $ 10
6 3 9 0 3 3 0 6 2 9 2 4 6 8 7 4 6 1 7 1

NB. Filter and mask
f =: 5 < ]
m =: f a
1 0 1 0 0 0 0 1 0 1 0 0 1 1 1 0 1 0 1 0

NB. Values of a on m
m # a
6 9 6 9 6 8 7 6 7

NB. Indices of a on m
I. m
0 2 7 9 12 13 14 16 18

NB. Joint results
(I.m) ,: (m # a)
0 2 7 9 12 13 14 16 18
6 9 6 9  6  8  7  6  7

换句话说,在这种情况下,你具有m&#f在上执行aI.在上执行m注意,m通过将copy的参数换行,最终结果可以从一个单独的动作中得出#~

(I. ,: (a #~ ]) m
0 2 7 9 12 13 14 16 18
6 9 6 9  6  8  7  6  7

并且a可以从行动上拉出m像这样:

a ( (]I.) ,: (#~ ])) m

但是由于m其本身是从fon上的一个动作(派生的a,我们可以这样写:

a ( (]I.) ,: (#~ ])) (f a)

这是一个简单的单子钩y v (f y)(v f) y

所以:

action =: (]I.) ,: (#~ ])
filter =: 5 < ]
data =: a

(action filter) data
0 2 7 9 12 13 14 16 18
6 9 6 9  6  8  7  6  7