首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算数组中每个字母数字的数量?(APL)

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

Stack Overflow用户
提问于 2020-10-14 06:36:40
回答 1查看 247关注 0票数 5

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

代码语言:javascript
复制
ABA455  
7L9O36G                                 
DZLFPEI

我会得到类似A:2B:1,4:1,5:2的第一行,每一行都是独立计算的。如果你能解释一下的话,我很想了解一下运营商的情况。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-14 07:18:25

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

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

代码语言:javascript
复制
      m ← 3 7⍴'ABA455 7L9O36GDZLFPEI'
      v ← m[1;]
      v
ABA455 

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

代码语言:javascript
复制
      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 

现在,我们将独特的元素与每个元素进行比较:

代码语言:javascript
复制
      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

将此表水平相加,我们将得到每个唯一元素的出现数:

代码语言:javascript
复制
      +/ unique ∘.= v
2 1 1 2 1

现在,我们只需要将这些独特的元素与它们各自的计数配对:

代码语言:javascript
复制
       unique ,[1.5] +/ unique ∘.= v
A 2
B 1
4 1
5 2
  1

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

代码语言:javascript
复制
      ∇ 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

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

代码语言:javascript
复制
      ⊂[2] m
┌───────┬───────┬───────┐
│ABA455 │7L9O36G│DZLFPEI│
└───────┴───────┴───────┘

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

代码语言:javascript
复制
      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│
└───┴───┴───┘

在网上试试!

如果您正在使用Dyalog,那么关键运算符()正是您所需要的:

代码语言:javascript
复制
      {⍺ ⍵}⌸ 'ABA455'
┌─┬───┐
│A│1 3│
├─┼───┤
│B│2  │
├─┼───┤
│4│4  │
├─┼───┤
│5│5 6│
└─┴───┘

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

代码语言:javascript
复制
      {⍺ (≢⍵)}⌸ 'ABA455'
A 2
B 1
4 1
5 2

现在,我们只需在每一行上应用这个函数。我们可以通过分解矩阵并将函数应用于以下每一个来实现这一点:

代码语言:javascript
复制
      {⍺ (≢⍵)}⌸¨ ↓ 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│
└───┴───┴───┘

在网上试试!

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64347826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档