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)的偏移量一个从边缘,即在中心。

Try it online!

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。

Try it online!

回应你自己的回答;你可以减少而不是递归:

{⊃{0,[⍺]⍵,[⍺]0}/(⍳≢⍴⍵),⊂⍵}

⊂⍵ 包围数组
(), 添加以下内容:
⍴⍵ 数组的形状
该元素的个数(即数组的秩)
⍳r 排名ɩ指数
{}/ 使用以下函数减少(在元素之间插入):
⍵,[⍺]0 沿左参数指示的轴追加0
0,[⍺]⍵ 沿左参数指示的轴添加0s
disclose(因为reduction把rank从1降到0,所以要把结果括起来)

换句话说,我们依次在每个轴上添加和附加 0。

Try it online!

(¯2-⍴)↑(1+⍴)↑⊢