如何在 Dyalog APL 中操作多个嵌套数组?
How to manipulate multiple nested arrays in Dyalog APL?
我得到的矩阵充满了不包括小写字母的字母数字值,如下所示:
XX11X1X
XX88X8X
Y000YYY
ZZZZ789
ABABABC
并负责计算每行中的重复次数,然后根据重复字符的排名计算分数。 {⍺ (≢⍵)}⌸¨ ↓ 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⊃
而不是 ⊃
获得第二个矩阵——有关详细信息,请参阅 ):
⊃{⍺ (≢⍵)}⌸¨ ↓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
但这种做法比较迂回,仅供参考
我得到的矩阵充满了不包括小写字母的字母数字值,如下所示:
XX11X1X
XX88X8X
Y000YYY
ZZZZ789
ABABABC
并负责计算每行中的重复次数,然后根据重复字符的排名计算分数。 {⍺ (≢⍵)}⌸¨ ↓ 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⊃
而不是 ⊃
获得第二个矩阵——有关详细信息,请参阅
⊃{⍺ (≢⍵)}⌸¨ ↓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
但这种做法比较迂回,仅供参考