APL 成语用零包围数组
APL Idiom to surround an array with zeros
(Dyalog) APL 中是否有简单的习惯用语来用零包围数字数组?
目前用于等级 1 的数值数组 NA
,或我使用的矢量
0,⍨0, NA
对于等级 2 的数组,我使用
0,[1]⍨0,[1]0,⍨0, NA
对于更高的等级,我可以重复这个模式,但我确信必须有更好的方法来做到这一点(并且对所有等级都有一个定义),但我就是想不出一个这似乎并不过分复杂。
所以,我将我的方法概括为满足我的 "works for arbitrary rank" 要求的递归 dfn,但我对此并不满意,因为我仍然认为有更好的方法来实现它只是失踪了。我把它作为一个答案,因为它在技术上回答了我的问题,但我仍在寻找更好的解决方案。
{(⍴⍴⍵){⍺=0:⍵ ⋄ (⍺-1)∇0,[⍺]⍨0,[⍺]⍵}⍵}
此 Dyalog APL 16.0 版解决方案(来自 here)可处理任意数量的维度:
{⍵@(1+⍳⍴⍵)⊢0⍴⍨2+⍴⍵}
⍵
数组
@(
位于
1+
一加
⍳
的所有索引
⍴⍵
数组的形状
)⊢
组成的数组中
0⍴⍨
零整形为形状
2+
两个加到
⍴⍵
数组的形状
换句话说,我们创建一个完全由 0 组成的数组,它在每个维度上都比数组大两个元素,然后我们将数组放入该数组(从而替换这些位置中的 0)的偏移量一个从边缘,即在中心。
Alternative version 定义了一个 at
运算符,因此可以在 16.0 之前使用。
{r←≢⍴⍵ ⋄ i←1⌽⍳r ⋄ {0⍪0⍪⍨i⍉⍵}⍣r⊢⍵}
⍴⍵
数组的形状
≢
该元素的数量(即数组的等级)
r←
将其存储为 r
(对于 rank)
⍳r
ɩ排名指数
1⌽
将它们旋转一步
i←
存储在i
(对于i索引)
⊢⍵
数组
{
…}⍣r
应用以下函数r
次(即每个维度一次):
i⍉⍵
根据i
对参数的坐标轴重新排序(即将下一个维度放在前面)
0⍪⍨
沿第一个轴追加0
0⍪
沿第一个轴添加0
换句话说,每个轴轮流在前面,我们在前面加上 0。
回应你自己的回答;你可以减少而不是递归:
{⊃{0,[⍺]⍵,[⍺]0}/(⍳≢⍴⍵),⊂⍵}
⊂⍵
包围数组
(
…),
添加以下内容:
⍴⍵
数组的形状
≢
该元素的个数(即数组的秩)
⍳r
排名ɩ指数
{
…}/
使用以下函数减少(在元素之间插入):
⍵,[⍺]0
沿左参数指示的轴追加0
0,[⍺]⍵
沿左参数指示的轴添加0s
⊃
disclose(因为reduction把rank从1降到0,所以要把结果括起来)
换句话说,我们依次在每个轴上添加和附加 0。
(Dyalog) APL 中是否有简单的习惯用语来用零包围数字数组?
目前用于等级 1 的数值数组 NA
,或我使用的矢量
0,⍨0, NA
对于等级 2 的数组,我使用
0,[1]⍨0,[1]0,⍨0, NA
对于更高的等级,我可以重复这个模式,但我确信必须有更好的方法来做到这一点(并且对所有等级都有一个定义),但我就是想不出一个这似乎并不过分复杂。
所以,我将我的方法概括为满足我的 "works for arbitrary rank" 要求的递归 dfn,但我对此并不满意,因为我仍然认为有更好的方法来实现它只是失踪了。我把它作为一个答案,因为它在技术上回答了我的问题,但我仍在寻找更好的解决方案。
{(⍴⍴⍵){⍺=0:⍵ ⋄ (⍺-1)∇0,[⍺]⍨0,[⍺]⍵}⍵}
此 Dyalog APL 16.0 版解决方案(来自 here)可处理任意数量的维度:
{⍵@(1+⍳⍴⍵)⊢0⍴⍨2+⍴⍵}
⍵
数组
@(
位于
1+
一加
⍳
⍴⍵
数组的形状
)⊢
组成的数组中
0⍴⍨
零整形为形状
2+
两个加到
⍴⍵
数组的形状
换句话说,我们创建一个完全由 0 组成的数组,它在每个维度上都比数组大两个元素,然后我们将数组放入该数组(从而替换这些位置中的 0)的偏移量一个从边缘,即在中心。
Alternative version 定义了一个 at
运算符,因此可以在 16.0 之前使用。
{r←≢⍴⍵ ⋄ i←1⌽⍳r ⋄ {0⍪0⍪⍨i⍉⍵}⍣r⊢⍵}
⍴⍵
数组的形状
≢
该元素的数量(即数组的等级)
r←
将其存储为 r
(对于 rank)
⍳r
ɩ排名指数
1⌽
将它们旋转一步
i←
存储在i
(对于i索引)
⊢⍵
数组
{
…}⍣r
应用以下函数r
次(即每个维度一次):
i⍉⍵
根据i
对参数的坐标轴重新排序(即将下一个维度放在前面)
0⍪⍨
沿第一个轴追加0
0⍪
沿第一个轴添加0
换句话说,每个轴轮流在前面,我们在前面加上 0。
回应你自己的回答;你可以减少而不是递归:
{⊃{0,[⍺]⍵,[⍺]0}/(⍳≢⍴⍵),⊂⍵}
⊂⍵
包围数组
(
…),
添加以下内容:
⍴⍵
数组的形状
≢
该元素的个数(即数组的秩)
⍳r
排名ɩ指数
{
…}/
使用以下函数减少(在元素之间插入):
⍵,[⍺]0
沿左参数指示的轴追加0
0,[⍺]⍵
沿左参数指示的轴添加0s
⊃
disclose(因为reduction把rank从1降到0,所以要把结果括起来)
换句话说,我们依次在每个轴上添加和附加 0。