Matrix APL:array';s元素替换与乘法

Matrix APL:array';s元素替换与乘法,matrix,multidimensional-array,apl,dyalog,array-replace,Matrix,Multidimensional Array,Apl,Dyalog,Array Replace,假设在APL语言中,我有一个10x3形状的2D数组。我不知道如何: 将整个数组中某些特定数字(例如1、2、3、4)的所有匹配项分别替换为0、10、100、1000。因此,我想在整个阵列中映射1到0、2到10、3到100和4到1000。我将使用以下示例数据: ⎕ ← 排列← ? 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 具体的← 1 2 3 4 替代品← 0

假设在APL语言中,我有一个10x3形状的2D数组。我不知道如何:
将整个数组中某些特定数字(例如1、2、3、4)的所有匹配项分别替换为0、10、100、1000。因此,我想在整个阵列中映射1到0、2到10、3到100和4到1000。

我将使用以下示例数据:

⎕ ← 排列← ? 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
具体的← 1 2 3 4
替代品← 0 10 100 1000
让我们定义一个helper函数来标识需要映射的元素的出现,即那些属于特定数字列表的成员:

事件← {⍵ ∊ 特定}
引用数组
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← {替换[特定]⍳ ⍵]}
地图3 1 4 1
100 0 1000 0
现在,我们可以将映射函数应用于出现的情况:

Map@引用数组
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
我们可以将整个过程定义为一个替换函数:

替换← 映射@事件
甚至不使用辅助函数直接获取完整定义:

替换← {替换[特定]⍳ ⍵]} @ {⍵ ∊ 特定}
产生的定义将是相同的:

替换数组
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
我们甚至可以定义一个通用替换操作符:

\u替换\u← {⍺⍺ ( ⍵⍵ ⌷⍨∘⊂ ⍳ ) @ ( ∊∘⍺⍺ ) ⍵}
(特定替换)数组
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
此运算符定义可在中找到


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

(1)≠ 特定)×10*特定-1
0 10 100 1000
现在我们可以写:

{(1)≠ ⍵ ) × 10 * ⍵ - 1} @ {⍵ ∊ 特定}数组
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实现和版本会很有用。dyalog 18.0.38756您知道有任何教程显示如何使用3d操作APL内置函数吗?MasteringDyalogAPL.pdf并没有涵盖很多3d内容。这应该是一个单独的问题,但可以看看三个有“rank operator”的网络研讨会在他们的标题中,和/或SP2。非常感谢亚当