在J语言中创建频率矩阵(统计数组元素数量)的实现方法
嘿,针对你要在J语言里统计数组元素频率(生成频率矩阵/表)的需求,我给你整理了几种实用的实现方案,结合你给出的单词数组示例来讲解:
方法1:用
/.~一键生成频率表(最简洁高效) J语言里的/.是键控副词,搭配~(Self,把原数组同时作为左右参数),再结合计数动词#,可以直接对数组进行分组统计,一行代码搞定:
counts =: # /.~ text
这里的逻辑是:/.~会把text中的每个唯一元素作为“键”,然后用#(计数)统计每个键在原数组中出现的次数。比如你给出的数组里conceal和option各出现2次,结果里这两个元素对应的值就是2,其他单次出现的元素对应值为1。
运行后你会得到一个字典形式的频率表,键是唯一元素,值是对应出现次数。如果想要更像“矩阵”的两列结构(元素+次数),可以用:
frequency_matrix =: (,. #/.~) text
这样输出就是一个二维数组,第一列是元素,第二列是对应的计数。
方法2:分步实现(适合理解过程)
如果想要拆解步骤,先获取唯一元素再逐个统计,也很容易实现:
- 第一步:提取数组中的唯一元素(用
~.去重)unique_elements =: ~. text - 第二步:对每个唯一元素,统计它在原数组中的出现次数(用
E.&判断存在性,#计数,"0逐元素处理)counts =: (#@E.&text)"0 unique_elements - 第三步:组合成频率矩阵
frequency_matrix =: unique_elements ,. counts
这种方式更直观,适合刚接触J语言的朋友理解背后的逻辑。
方法3:用
table生成交叉频率矩阵(多变量场景) 如果你的需求是生成真正的“矩阵”(比如元素两两组合的频率),可以用table函数:
cross_frequency_matrix =: text table text
这个矩阵的行和列都是text的唯一元素,单元格值是对应元素对的出现次数。不过如果只是单变量的频率统计,前面两种方法会更直接。
示例演示
假设你的输入数组是:
text =: 'speak';'conceal';'terribl';'option';'write';'book';'come';'tuesdai';'matter';'act';'conceal';'catastroph';'integr';'depart';'justic';'put';'wai';'choic';'realli';'bad';'option'
运行#/.~ text后,输出结果会是:
act 1 bad 1 book 1 catastroph 1 choic 1 come 1 conceal 2 depart 1 integr 1 justic 1 matter 1 option 2 put 1 realli 1 speak 1 terribl 1 tuesdai 1 wai 1 write 1
J语言的动词和副词组合就是这么灵活,根据你的需求选对应的方法就行~
内容的提问来源于stack exchange,提问作者Kevin Choi
相关产品推荐
相关产品推荐

