我不知道如何获取矩阵,并计算每行的字母数字值的数量。我只会用我正在计算的值来获取矩阵。例如,如果我得到:
ABA455
7L9O36G
DZLFPEI我会得到类似A:2B:1,4:1,5:2的第一行,每一行都是独立计算的。如果你能解释一下的话,我很想了解一下运营商的情况。谢谢。
发布于 2020-10-14 07:18:25
以下内容应适用于任何主流的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│
└───┴───┴───┘如果您正在使用Dyalog,那么关键运算符(⌸)正是您所需要的:
{⍺ ⍵}⌸ 'ABA455'
┌─┬───┐
│A│1 3│
├─┼───┤
│B│2 │
├─┼───┤
│4│4 │
├─┼───┤
│5│5 6│
└─┴───┘它接受一个操作数,并将其调用一次为每个唯一值,其中特定值为左参数,而出现索引列表为右参数。然而,我们对实际发生的事件并不感兴趣,只对它们的数量感兴趣:
{⍺ (≢⍵)}⌸ 'ABA455'
A 2
B 1
4 1
5 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│
└───┴───┴───┘https://stackoverflow.com/questions/64347826
复制相似问题