问题描述
(Dyalog) APL 学习者问题
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} }、(1 2)
、(1,2)
,然后再次(1,2)
。
这样看可能更容易:
(1,2)
(1 2)3⌷Y
3 6
的意思是“从第一行和第二行,给我第三列的元素”。
因此,如果您想给出这样的索引,您可能需要将 each 运算符 (1 2)3⌷
与 ¨
一起使用:
⌷
如果你真的很想要那个,那么你可以使用
(1 1)(2 2)⌷¨⊂Y
1 5
正如其他答案所示,有更多的索引替代方法。我还可以推荐以下有关索引的网络研讨会:https://dyalog.tv/Webinar/?v=AgYDvSF2FfU .
花点时间查看视频中的替代方案,APL 与 Python 不同:在 APL 中,通常有不止一种明显的方法可以做到:)