对J Tally的误解(#)

时间:2012-08-21 15:13:59

标签: arrays rank j

在J中,要查找可以使用的元素数量#right?

e.g。

# 2 3 4 5 6
5

行。那么多维数组

呢?
b=: 2 3 4 $ i.2

   b
0 1 0 1
0 1 0 1
0 1 0 1

0 1 0 1
0 1 0 1
0 1 0 1

这里#b是2.我猜是因为第一个维度的长度为2,即数组的帧。

所以,如果我稍微改变一下:

b=:3 2 4 $ i.2
   b
0 1 0 1
0 1 0 1

0 1 0 1
0 1 0 1

0 1 0 1
0 1 0 1

这有3个,因为前导尺寸长度为3,对吧?

但我无法解释这一点:

#\b
1 2 3

我通过b的元素计算。所以我认为每个2x4子阵列都会被使用,我希望#\ b能够给出

2 2 2

,因为:

c=:2 4 $i.2
   c
0 1 0 1
0 1 0 1
   #c
2

所以我的问题是,为什么#\ b = 1 2 3?我认为这与动词排名有关,对吧?我很难理解这个话题......

2 个答案:

答案 0 :(得分:6)

查看正在发生的事情的最简单方法是< \b <\b ┌───────┬───────┬───────┐ │0 1 0 1│0 1 0 1│0 1 0 1│ │0 1 0 1│0 1 0 1│0 1 0 1│ │ │ │ │ │ │0 1 0 1│0 1 0 1│ │ │0 1 0 1│0 1 0 1│ │ │ │ │ │ │ │0 1 0 1│ │ │ │0 1 0 1│ └───────┴───────┴───────┘

u\y

uy应用于<\1 2 3 ┌─┬───┬─────┐ │1│1 2│1 2 3│ └─┴───┴─────┘ #\1 2 3 1 2 3 */\1 2 3 1 2 6 的前缀:

#\b

因此,b会为您提供每个#"2 b 2 2 2 <"2 b ┌───────┬───────┬───────┐ │0 1 0 1│0 1 0 1│0 1 0 1│ │0 1 0 1│0 1 0 1│0 1 0 1│ └───────┴───────┴───────┘ 前缀的项目数。

你可能认为你会得到的是b的项目的2级数:

{{1}}

答案 1 :(得分:0)

要获取多维数组中rank-0项的计数,请执行以下操作:

rank_0s =: */&$
wild1 =: 2 3 4 $ 'abcdefghijklmnopqrstuvwxyz'

rank_0s wild1

24