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

Par*_*eri 4 matrix apl multidimensional-array dyalog array-replace

假设用 APL 语言,我有一个形状为 10x3 的 2D 数组。我不知道如何:将整个数组中出现的所有特定数字(例如 1、2、3、4)分别替换为 0、10、100、1000。所以我想将整个数组中的1映射到0、2映射到10、3映射到100、4映射到1000。

Adá*_*dám 5

\n

我将使用以下示例数据:

\n
      \xe2\x8e\x95 \xe2\x86\x90 array \xe2\x86\x90 ? 10 3 \xe2\x8d\xb4 10\n 5  7  8\n10  2 10\n 9  8 10\n 3  5  4\n 6  6  4\n 2  9  7\n 4  5 10\n 1  9  4\n 1 10  1\n10  5  3\n      specific \xe2\x86\x90 1 2 3 4\n      replacements \xe2\x86\x90 0 10 100 1000\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
      Occurrences \xe2\x86\x90 {\xe2\x8d\xb5 \xe2\x88\x8a specific}\n      Occurrences array\n0 0 0\n0 1 0\n0 0 0\n1 0 1\n0 0 1\n1 0 0\n1 0 0\n1 0 1\n1 0 1\n0 0 1\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
      Map \xe2\x86\x90 {replacements[specific \xe2\x8d\xb3 \xe2\x8d\xb5]}\n      Map 3 1 4 1\n100 0 1000 0\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
      Map @ Occurrences array\n   5  7    8\n  10 10   10\n   9  8   10\n 100  5 1000\n   6  6 1000\n  10  9    7\n1000  5   10\n   0  9 1000\n   0 10    0\n  10  5  100\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
      Replace \xe2\x86\x90 Map @ Occurrences\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
      Replace \xe2\x86\x90 {replacements[specific \xe2\x8d\xb3 \xe2\x8d\xb5]} @ {\xe2\x8d\xb5 \xe2\x88\x8a specific}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
      Replace array\n   5  7    8\n  10 10   10\n   9  8   10\n 100  5 1000\n   6  6 1000\n  10  9    7\n1000  5   10\n   0  9 1000\n   0 10    0\n  10  5  100\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
      _Replace_ \xe2\x86\x90 {\xe2\x8d\xba\xe2\x8d\xba ( \xe2\x8d\xb5\xe2\x8d\xb5 \xe2\x8c\xb7\xe2\x8d\xa8\xe2\x88\x98\xe2\x8a\x82 \xe2\x8d\xb3 ) @ ( \xe2\x88\x8a\xe2\x88\x98\xe2\x8d\xba\xe2\x8d\xba ) \xe2\x8d\xb5}\n      (specific _Replace_ replacements) array\n   5  7    8\n  10 10   10\n   9  8   10\n 100  5 1000\n   6  6 1000\n  10  9    7\n1000  5   10\n   0  9 1000\n   0 10    0\n  10  5  100\n
Run Code Online (Sandbox Code Playgroud)\n

该运算符定义可以在APLcart中通过搜索和替换元素等查询找到。

\n
\n

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

\n
      ( 1 \xe2\x89\xa0 specific ) \xc3\x97 10 * specific - 1\n0 10 100 1000\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
      {( 1 \xe2\x89\xa0 \xe2\x8d\xb5 ) \xc3\x97 10 * \xe2\x8d\xb5 - 1} @ {\xe2\x8d\xb5 \xe2\x88\x8a specific} array\n   5  7    8\n  10 10   10\n   9  8   10\n 100  5 1000\n   6  6 1000\n  10  9    7\n1000  5   10\n   0  9 1000\n   0 10    0\n  10  5  100\n
Run Code Online (Sandbox Code Playgroud)\n