APL:数组的元素替换和乘法

Posted

技术标签:

【中文标题】APL:数组的元素替换和乘法【英文标题】:APL: array's element replacement and multiplication 【发布时间】:2021-01-23 08:01:38 【问题描述】:

假设在 APL 语言中,我有一个形状为 10x3 的二维数组。我无法弄清楚如何: 将整个数组中出现的所有特定数字(例如 1、2、3、4)分别替换为 0、10、100、1000。所以我想把整个数组中的1映射到0、2映射到10、3映射到100、4映射到1000。

【问题讨论】:

了解您使用的 APL 实现和版本会很有用。 dyalog 18.0.38756 你知道有什么教程可以展示使用 3d 操作 APL 内置函数吗? MasteringDyalogAPL.pdf 并没有涵盖很多 3d。 应该是一个单独的问题,但请查看标题中包含“排名运算符”的三个网络研讨会 here 和/或 SP2 here。 非常感谢亚当 【参考方案1】:

我将使用这个示例数据:

      ⎕ ← array ← ? 10 3 ⍴ 10
 5  7  8
10  2 10
 9  8 10
 3  5  4
 6  6  4
 2  9  7
 4  5 10
 1  9  4
 1 10  1
10  5  3
      specific ← 1 2 3 4
      replacements ← 0 10 100 1000

让我们定义一个辅助函数来识别需要映射的元素的出现,即那些是我们特定数字列表的成员的元素:

      Occurrences ← ⍵ ∊ specific
      Occurrences array
0 0 0
0 1 0
0 0 0
1 0 1
0 0 1
1 0 0
1 0 0
1 0 1
1 0 1
0 0 1

接下来,我们定义一个映射函数,查找特定数字集合中每个元素的索引,并使用这些索引索引替换:

      Map ← replacements[specific ⍳ ⍵]
      Map 3 1 4 1
100 0 1000 0

现在我们可以应用映射函数出现:

      Map @ Occurrences array
   5  7    8
  10 10   10
   9  8   10
 100  5 1000
   6  6 1000
  10  9    7
1000  5   10
   0  9 1000
   0 10    0
  10  5  100

我们可以将整个事物定义为单个替换函数:

      Replace ← Map @ Occurrences

或者甚至不使用辅助函数直接获取完整定义:

      Replace ← replacements[specific ⍳ ⍵] @ ⍵ ∊ specific

生成的定义将相同:Try it online!

      Replace array
   5  7    8
  10 10   10
   9  8   10
 100  5 1000
   6  6 1000
  10  9    7
1000  5   10
   0  9 1000
   0 10    0
  10  5  100

我们甚至可以定义一个通用的替换运算符:Try it online!

      _Replace_ ← ⍺⍺ ( ⍵⍵ ⌷⍨∘⊂ ⍳ ) @ ( ∊∘⍺⍺ ) ⍵
      (specific _Replace_ replacements) array
   5  7    8
  10 10   10
   9  8   10
 100  5 1000
   6  6 1000
  10  9    7
1000  5   10
   0  9 1000
   0 10    0
  10  5  100

可以在APLcart 和a query like search and replace elements 中找到此运算符定义。


考虑使用特定值和替换值之间的数学关系,而不是进行查找:

      ( 1 ≠ specific ) × 10 * specific - 1
0 10 100 1000

现在我们可以写:Try it online!

      ( 1 ≠ ⍵ ) × 10 * ⍵ - 1 @ ⍵ ∊ specific array
   5  7    8
  10 10   10
   9  8   10
 100  5 1000
   6  6 1000
  10  9    7
1000  5   10
   0  9 1000
   0 10    0
  10  5  100

【讨论】:

以上是关于APL:数组的元素替换和乘法的主要内容,如果未能解决你的问题,请参考以下文章

编写一个java程序,实现将数组arr中索引位置是2的元素替换为bb,并将替换前数组中的元素和替换

APL Dyalog嵌套数组元素转换

js数组操作(添加、删除、替换元素)

数组元素的填充与替换排序和复制

如何用随机数组元素替换文本?

在 Ruby 中,如何用可能的多个元素替换数组中的元素?