首页 > 解决方案 > APL:数组的元素替换和乘法

问题描述

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

标签: matrixmultidimensional-arrayapldyalogarray-replace

解决方案


我将使用这个示例数据:

      ⎕ ← 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}

结果定义将是相同的:在线尝试!

      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

我们甚至可以定义一个通用的替换运算符:在线试用!

      _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中找到,其中包含搜索和替换元素之类的查询


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

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

现在我们可以写:在线尝试!

      {( 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

推荐阅读