如何从 APL 隐式函数中的矩阵中提取多个元素?
How can I extract multiple elements from a matrix in an APL tacit function?
(Dyalog) APL 学习者问题
如果我有一个矩阵 Y:
Y
4 9 2
3 5 7
8 1 6
我可以这样得到它的两个成员:
Y[(1 1) (2 2)]
4 5
我可以使用 dfn 语法使用相同的技术:
{⍵[(1 1) (2 2)]}Y
4 5
但是,我不知道如何在默认函数中执行等效操作。特别是括号索引似乎在默认函数中不起作用,而且我找不到将小队索引与索引列表一起使用的方法。
有没有办法做到这一点,或者这是默认功能的限制?
请注意,在我的真实示例中生成了索引列表,因此我不能简单地执行 (((1 1)⌷⊢),(2 2)⌷⊢)Y
或类似的操作。
(1 1)(2 2)⌷¨⊂Y
有效,也
(1 1)(2 2)⊃⍤0 99⊢Y
人们可能会尝试的第一件事是
Y ← 3 3⍴⍳9
Y
1 2 3
4 5 6
7 8 9
Y[(1 1)(2 2)]
1 5
1 1⌷Y
1
(1 1)(2 2)⌷Y
2 2
2 2
但我们看到 (1 1)(2 2)⌷Y
不起作用。发生的事情是 ⌷
查看其左侧的向量并构建索引的所有组合,这只是构建一个 2 x 2 的 2 矩阵,因为 (1 1)(2 2)
被解释为索引 (1 2)
、(1, 2)
、(1, 2)
,然后再次 (1, 2)
。
这样看可能更容易:
(1 2)3⌷Y
3 6
(1 2)3⌷
意思是“从第一行和第二行,给我第三列的元素”。
因此,如果你想给出这样的索引,你可能需要使用每个运算符 ¨
和 ⌷
:
(1 1)(2 2)⌷¨⊂Y
1 5
如果你真的想默认那个,那么你可以使用
I ← ⌷¨∘⊂
正如其他答案所显示的那样,除了索引之外还有更多选择。我还可以推荐以下关于索引的网络研讨会:https://dyalog.tv/Webinar/?v=AgYDvSF2FfU .
花点时间浏览一下视频中的备选方案,APL 不像 Python:在 APL 中,通常有不止一种明显的方法:)
(Dyalog) APL 学习者问题
如果我有一个矩阵 Y:
Y
4 9 2
3 5 7
8 1 6
我可以这样得到它的两个成员:
Y[(1 1) (2 2)]
4 5
我可以使用 dfn 语法使用相同的技术:
{⍵[(1 1) (2 2)]}Y
4 5
但是,我不知道如何在默认函数中执行等效操作。特别是括号索引似乎在默认函数中不起作用,而且我找不到将小队索引与索引列表一起使用的方法。
有没有办法做到这一点,或者这是默认功能的限制?
请注意,在我的真实示例中生成了索引列表,因此我不能简单地执行 (((1 1)⌷⊢),(2 2)⌷⊢)Y
或类似的操作。
(1 1)(2 2)⌷¨⊂Y
有效,也
(1 1)(2 2)⊃⍤0 99⊢Y
人们可能会尝试的第一件事是
Y ← 3 3⍴⍳9
Y
1 2 3
4 5 6
7 8 9
Y[(1 1)(2 2)]
1 5
1 1⌷Y
1
(1 1)(2 2)⌷Y
2 2
2 2
但我们看到 (1 1)(2 2)⌷Y
不起作用。发生的事情是 ⌷
查看其左侧的向量并构建索引的所有组合,这只是构建一个 2 x 2 的 2 矩阵,因为 (1 1)(2 2)
被解释为索引 (1 2)
、(1, 2)
、(1, 2)
,然后再次 (1, 2)
。
这样看可能更容易:
(1 2)3⌷Y
3 6
(1 2)3⌷
意思是“从第一行和第二行,给我第三列的元素”。
因此,如果你想给出这样的索引,你可能需要使用每个运算符 ¨
和 ⌷
:
(1 1)(2 2)⌷¨⊂Y
1 5
如果你真的想默认那个,那么你可以使用
I ← ⌷¨∘⊂
正如其他答案所显示的那样,除了索引之外还有更多选择。我还可以推荐以下关于索引的网络研讨会:https://dyalog.tv/Webinar/?v=AgYDvSF2FfU .
花点时间浏览一下视频中的备选方案,APL 不像 Python:在 APL 中,通常有不止一种明显的方法:)