【问题标题】:How would I go about counting the amount of each alphanumerical in an array? (APL)我将如何计算数组中每个字母数字的数量? (APL)
【发布时间】:2020-10-14 15:18:25
【问题描述】:

我不知道如何获取矩阵并计算每行的字母数字值的数量。我只会采用我正在计算的值的矩阵。 例如,如果我得到:

ABA455  
7L9O36G                                 
DZLFPEI

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

【问题讨论】:

  • 欢迎来到 Stack Overflow。如果您指定使用的 APL 实现和版本,我们可以为您提供更好的答案。
  • 您的矩阵有尾随空格。这是故意的吗?

标签: classification counting apl


【解决方案1】:

以下内容应该适用于任何主流 APL 实现。

让我们从一个简单的字符向量开始:

      m ← 3 7⍴'ABA455 7L9O36GDZLFPEI'
      v ← m[1;]
      v
ABA455 

我们可以通过过滤来找到唯一的字符,只保留与自己第一次出现的索引相同的元素:

      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 

现在我们将唯一元素与每个元素进行比较:

      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

将此表水平求和,可以得出每个唯一元素的出现次数:

      +/ unique ∘.= v
2 1 1 2 1

现在我们只需要将唯一元素与其各自的计数配对:

       unique ,[1.5] +/ unique ∘.= v
A 2
B 1
4 1
5 2
  1

让我们把它放到一个实用函数中:

      ∇ 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

现在我们需要对矩阵的每一行应用这个函数。我们首先将矩阵拆分为向量的向量:

      ⊂[2] m
┌───────┬───────┬───────┐
│ABA455 │7L9O36G│DZLFPEI│
└───────┴───────┴───────┘

然后我们将效用函数应用于每个向量:

      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│
└───┴───┴───┘

Try it online!


如果您使用的是 Dyalog APL,那么 Key 运算符 () 就是您所需要的:

      {⍺ ⍵}⌸ 'ABA455'
┌─┬───┐
│A│1 3│
├─┼───┤
│B│2  │
├─┼───┤
│4│4  │
├─┼───┤
│5│5 6│
└─┴───┘

它接受一个操作数,并为每个唯一值调用一次,将特定值作为左参数,将出现索引列表作为右参数。但是,我们对实际发生的事件不感兴趣,只对它们的计数感兴趣:

      {⍺ (≢⍵)}⌸ 'ABA455'
A 2
B 1
4 1
5 2

现在我们只需在每一行上应用这个函数。我们可以通过拆分矩阵并使用 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│
└───┴───┴───┘

Try it online!

【讨论】:

  • 我想知道您为什么将Counts 定义为tradfn 而不是dfn? dfns 是 Dyalog APL 特有的吗?
  • @RGS 它们仅在 Dyalog APL、NARS2000 和更新的实现中完全实现。尽管 GNU APL 有它们,但它们非常有限,因为它们不允许多个语句,也不允许在赋值时本地化变量。 APL2、APL+Win 和 APLX 等主要实现不支持 dfns。
  • 嘿,亚当,我正在使用 Dyalog APL,没有尾随空格不是故意的。非常感谢,这对我帮助很大。我的新问题是我可以达到将它们全部计算在内的程度,但它将结果存储在嵌套数组中,但每个数组都是标量?我希望能够使用每一行的结果来进一步操作它。因此,一旦我得到重复次数,我需要能够将重复次数和与每个字母数字值对应的数字相乘,但我似乎无法操纵结果。再次感谢您的帮助。希望很快能收到您的来信。
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多