JTP*_*JTP 4 classification counting apl
我无法弄清楚如何获取矩阵并计算每行的字母数字值的数量。我只会采用我正在计算的值的矩阵。例如,如果我得到:
ABA455
7L9O36G
DZLFPEI
Run Code Online (Sandbox Code Playgroud)
对于第一行,我会得到类似 A:2 B:1 4:1 5:2 的结果,每一行都将独立计算。如果您也可以解释一下,我最想了解所使用的运算符。谢谢你。
以下应该适用于任何主流 APL 实现。
让我们从一个简单的字符向量开始:
m ? 3 7?'ABA455 7L9O36GDZLFPEI'
v ? m[1;]
v
ABA455
Run Code Online (Sandbox Code Playgroud)
我们可以通过过滤来找到唯一的字符,只保留与第一次出现时索引相同的元素:
v ? v
1 2 1 4 5 5 7
? ? v
1 2 3 4 5 6 7
( v ? v ) = ? ? v
1 1 0 1 1 0 1
? ? unique ? ( (v ? v) = ? ? v ) / v
AB45
Run Code Online (Sandbox Code Playgroud)
现在我们将唯一元素与每个元素进行比较:
unique ?.= v
1 0 1 0 0 0 0
0 1 0 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 1 1 0
0 0 0 0 0 0 1
Run Code Online (Sandbox Code Playgroud)
将此表水平求和为我们提供了每个唯一元素的出现次数:
+/ unique ?.= v
2 1 1 2 1
Run Code Online (Sandbox Code Playgroud)
现在我们只需要将唯一元素与其各自的计数配对:
unique ,[1.5] +/ unique ?.= v
A 2
B 1
4 1
5 2
1
Run Code Online (Sandbox Code Playgroud)
让我们把它放到一个效用函数中:
? c ? Counts v; u
u ? ( (v ? v) = ? ? v ) / v
c ? u ,[1.5] +/ u ?.= v
?
Counts v
A 2
B 1
4 1
5 2
1
Run Code Online (Sandbox Code Playgroud)
现在我们需要在矩阵的每一行上应用这个函数。我们首先将矩阵拆分为向量的向量:
?[2] m
?????????????????????????
?ABA455 ?7L9O36G?DZLFPEI?
?????????????????????????
Run Code Online (Sandbox Code Playgroud)
然后我们将效用函数应用于每个向量:
Counts¨ ?[2] m
?????????????
?A 2?7 1?D 1?
?B 1?L 1?Z 1?
?4 1?9 1?L 1?
?5 2?O 1?F 1?
? 1?3 1?P 1?
? ?6 1?E 1?
? ?G 1?I 1?
?????????????
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 Dyalog APL,那么 Key 运算符 ( ?) 正是您所需要的:
{? ?}? 'ABA455'
???????
?A?1 3?
???????
?B?2 ?
???????
?4?4 ?
???????
?5?5 6?
???????
Run Code Online (Sandbox Code Playgroud)
它采用单个操作数并为每个唯一值调用一次,将特定值作为左参数,将出现索引列表作为右参数。但是,我们对实际发生的事件不感兴趣,只对它们的计数感兴趣:
{? (??)}? 'ABA455'
A 2
B 1
4 1
5 2
Run Code Online (Sandbox Code Playgroud)
现在我们只需要在每一行上应用这个函数。我们可以通过拆分矩阵并使用 Each 应用函数来做到这一点:
{? (??)}?¨ ? m
?????????????
?A 2?7 1?D 1?
?B 1?L 1?Z 1?
?4 1?9 1?L 1?
?5 2?O 1?F 1?
? 1?3 1?P 1?
? ?6 1?E 1?
? ?G 1?I 1?
?????????????
Run Code Online (Sandbox Code Playgroud)