matrix - APL:数组的元素替换和乘法
问题描述
假设在 APL 语言中,我有一个形状为 10x3 的二维数组。我无法弄清楚如何:分别用 0、10、100、1000 替换整个数组中出现的某些特定数字(例如 1、2、3、4)。所以我想在整个数组中将 1 映射到 0、2 到 10、3 到 100 和 4 到 1000。
解决方案
我将使用这个示例数据:
⎕ ← 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
推荐阅读
- bbedit - 使用 BBedit 将 CR 替换为 LF
- facebook - Facebook 链接共享者预览图像未在某些手机上显示完整预览
- node.js - 无法使用 DELETE 或 POST 请求成功删除 mongoose DB 中的文档
- javascript - ChartJS 不使用 Moment.js 显示时间数据
- c - 如何在不知道长度的情况下迭代 char**
- python - Order QuerySet 依赖于对多对多字段的排序
- c# - 使用带有 C# 的 MediaTranscoder 将 PCM 音频转码为 MP3
- c - 如何在 C 中的 main 中使用对象外部方法?
- asp.net-web-api - DOTNET WebApi 中的 jwt 令牌
- user-interface - 在magento 2.3.3中只需要ui形式的时间选择器和ui网格