mapping - 如何在 Dyalog APL 中操作多个嵌套数组?

标签 mapping lookup apl dyalog

我得到了充满字母数字值的矩阵,不包括小写字母,如下所示:

XX11X1X
XX88X8X
Y000YYY
ZZZZ789
ABABABC
并负责计算每行中的重复次数,然后根据被重复角色的排名计算分数。 I used {⍺ (≢⍵)}⌸¨ ↓ m帮我。对于上面的例子,我会得到这样的东西:
X 4  X 4  Y 4  Z 4  A 3 
1 3  8 3  0 3  7 1  B 3 
               8 1  C 1 
               9 1     
这很好,但现在我需要做一个能够将数字与每个字母相乘的函数。我可以使用 访问第一个矩阵但后来我完全迷失了如何访问其他人。我可以简单地写⊃w[2]⊃w[3]等等,但我需要一种方法在一个函数中同时更改每个矩阵。对于这个例子,排名的数组如下:ZYXWVUTSRQPONMLKJIHGFEDCBA9876543210所以对于第一个数组XX11X1X对应于:
X 4
1 3
所以X是数组中的第 3 位,因此它对应于 3,而 1 是第 35 位,所以它是 35。最终得分类似于 (3×104)+(35×103)。我最大的问题不一定是评分部分,而是能够在一个函数中单独访问每个矩阵。所以对于这个嵌套数组:
 X 4  X 4  Y 4  Z 4  A 3 
 1 3  8 3  0 3  7 1  B 3 
                8 1  C 1 
                9 1      
如果我这样做 arr[1]它给了我标量
 X 4
 1 3
⍴ arr[1]没有给我任何确认,所以我可以做⊃arr[1]获取矩阵本身并单独访问每一列。这就是我卡住的地方。我正在尝试编写一个函数来对每个矩阵进行数学运算,然后将这些结果保存到一个数组中。我可以轻松地对第一个矩阵进行数学运算,但我不能对所有矩阵都进行数学运算。我使用 {⍺ (≢⍵)}⌸¨ ↓ m 可能犯了一个错误得到这些矩阵。谢谢。

最佳答案

使用您的示例安排:

      ⎕ ← arranged ← ⌽ ⎕D , ⎕A
ZYXWVUTSRQPONMLKJIHGFEDCBA9876543210
所以现在,我们可以得到索引值:
      1 ⌷ m
XX11X1X
      ∪ 1 ⌷ m
X1
      arranged ⍳ ∪ 1 ⌷ m
3 35
虽然您可以先计算中间步骤,但将大部分最终公式包含在 Key 的操作数中要简单得多:
      { ( arranged ⍳ ⍺ ) × 10 * ≢⍵ }⌸¨ ↓m
┌───────────┬───────────┬───────────┬─────────────────┬───────────────┐
│30000 35000│30000 28000│20000 36000│10000 290 280 270│26000 25000 240│
└───────────┴───────────┴───────────┴─────────────────┴───────────────┘
现在我们只需要总结每个:
      +/¨ { ( arranged ⍳ ⍺ ) × 10 * ≢⍵ }⌸¨ ↓m
65000 58000 56000 10840 51240
事实上,我们可以将求和与 Key 的应用结合起来,避免双重循环:
      { +/ { ( arranged ⍳ ⍺ ) × 10 * ≢⍵ }⌸ ⍵}¨ ↓m
65000 58000 56000 10840 51240

为了完整起见,这里有一种使用中间结果的方法。让我们从处理第一个矩阵开始(您可以使用 2⊃ 而不是 获得第二个矩阵——有关详细信息,请参阅 Problems when trying to use arrays in APL. What have I missed? ):
      ⊃{⍺ (≢⍵)}⌸¨ ↓m
X 4
1 3
我们可以通过归约在左列元素和右列元素之间插入一个函数:
      {⍺ 'foo' ⍵}/ ⊃{⍺ (≢⍵)}⌸¨ ↓m
┌─────────┬─────────┐
│┌─┬───┬─┐│┌─┬───┬─┐│
││X│foo│4│││1│foo│3││
│└─┴───┴─┘│└─┴───┴─┘│
└─────────┴─────────┘
所以现在我们只需要修改占位符函数,在排列的项目中查找左边的参数,然后乘以 10 的右边参数的幂:
      { ( arranged ⍳ ⍺ ) × 10 * ⍵ }/ ⊃{⍺ (≢⍵)}⌸¨ ↓m
30000 35000
我们不是仅将其应用于第一个矩阵,而是将其应用于每个矩阵:
      { ( arranged ⍳ ⍺ ) × 10 * ⍵ }/¨ {⍺ (≢⍵)}⌸¨ ↓m
┌───────────┬───────────┬───────────┬─────────────────┬───────────────┐
│30000 35000│30000 28000│20000 36000│10000 290 280 270│26000 25000 240│
└───────────┴───────────┴───────────┴─────────────────┴───────────────┘
现在我们只需要总结每个:
      +/¨ { ( arranged ⍳ ⍺ ) × 10 * ⍵ }/¨ {⍺ (≢⍵)}⌸¨ ↓m
65000 58000 56000 10840 51240
但是,这是一种比较迂回的方法,在此仅作引用。

关于mapping - 如何在 Dyalog APL 中操作多个嵌套数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64365127/

相关文章:

apl - Dyalog APL - 从 .txt 文件读取

arguments - 如何将多个参数传递给 APL 函数

mapping - RML 中是否有一种解决方案,可以在不清理输入数据的情况下,在输入的一个数据元素(单元格)中处理多个复杂实体?

typescript - 如何让 TypeScript 查找类型在这种情况下工作?

c++ - 字符串数组到 C++ 函数

c# - 以编程方式从查找字段值中获取 ID 的更好方法是什么?

java - Hibernate 中组合键的多对多关系

javascript - 验证 Javascript 函数返回的内容

java - JPA(Hibernate、EclipseLink)映射 : why doesn't this code work (chain of 2 relationships using JPA 2. 0,@EmbeddedId 复合 PK-FK)?

error-handling - ⎕SIGNAL为什么没有被::error guards?捕获