Dyalog APL嵌套数组:无循环操作各子数组的同行/列元素
对嵌套数组的子数组统一行列执行标量运算(无循环)
在APL中,无需编写显式循环,利用**每个运算符¨**就能批量处理嵌套数组中的所有子数组,针对同一行/列执行标量乘、加等操作。
示例场景:给每个子数组的第2列元素乘2
首先定义你的示例数组:
A ← (4 3)(5 3)(3 3)⍴¨⊂⍳15
执行修改操作:
A ← {⍵[;2] ← 2×⍵[;2] ⋄ ⍵} ¨ A
代码解释
{⍵[;2] ← 2×⍵[;2] ⋄ ⍵}:匿名函数,接收单个子数组,将其第2列([;2]是列索引,APL为1-based)的元素乘2后赋值回原位置,最后返回修改后的子数组。¨ A:将上述匿名函数应用到A的每一个子数组上,实现批量处理。
执行后查看结果:
A ┌──────────┬──────────┬───────┐ │ 1 4 3│ 1 4 3│1 4 3│ │ 4 10 6│ 4 10 6│4 10 6│ │ 7 16 9│ 7 16 9│7 16 9│ │10 22 12│10 22 12│ │ │ │13 28 15│ │ └──────────┴──────────┴───────┘
扩展:对指定行执行操作
如果要给每个子数组的第3行元素乘2,只需调整索引为行维度:
A ← {⍵[3;] ← 2×⍵[3;] ⋄ ⍵} ¨ A
加法操作示例
若要给第2列元素加2,可利用布尔掩码实现更简洁的写法:
A ← (⊢ + (0 2 0)×(=2∘⍳⍴⍵)) ¨ A
这里(=2∘⍳⍴⍵)生成与子数组同形状的布尔数组,仅第2列为1,乘以标量2后与原数组相加,实现目标列的加法修改。
内容的提问来源于stack exchange,提问作者xpqz
相关产品推荐
相关产品推荐

