我将如何计算数组中每个字母数字的数量?(APL)

JTP*_*JTP 4 classification counting apl

我无法弄清楚如何获取矩阵并计算每行的字母数字值的数量。我只会采用我正在计算的值的矩阵。例如,如果我得到:

ABA455  
7L9O36G                                 
DZLFPEI
Run Code Online (Sandbox Code Playgroud)

对于第一行,我会得到类似 A:2 B:1 4:1 5:2 的结果,每一行都将独立计算。如果您也可以解释一下,我最想了解所使用的运算符。谢谢你。

Adá*_*dám 5

以下应该适用于任何主流 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)

在线试试吧!