在 J 中使用向量/矩阵时打印值及其相关索引

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

如果我想检查向量或矩阵中有多少值小于给定值 我可以使用 +/ (a < 20)。但是如果我想知道具体值和它的索引怎么办? 像 (2(value) 5(index)) 作为 table。我查看了 i., i:(给出第一个和最后一个位置)和 I。首先排序有帮助吗?

J 中一个非常常见的模式是从过滤器创建掩码并在钩子或叉子中使用掩码数据对 and/or 应用操作:

((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 的操作中得出
(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 本身是从 a 上的一个动作 (f) 派生的,我们可以写成:

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

这是一个简单的 monadic hook 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