APL成语用零

时间:2018-06-05 16:46:19

标签: apl dyalog

(Dyalog)APL中有一个简单的成语用零包围数字数组吗?

目前,对于排名为1的数值数组NA,或使用

的向量
0,⍨0, NA

对于排名为2的数组我使用

0,[1]⍨0,[1]0,⍨0, NA

对于更高级别我可以重复这个模式,但我确信必须有一个更好的方法来做到这一点(并且对所有级别都有一个定义),但是我不能想出一个没有看起来过于复杂。

5 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

此Dyalog APL 16.0版解决方案(来自here)处理任意数量的维度:

{⍵@(1+⍳⍴⍵)⊢0⍴⍨2+⍴⍵}

数组

@(置于

1+一加

的所有索引

⍴⍵数组的形状

)⊢在由

组成的数组中

0⍴⍨零重塑为形状

2+两个添加到

⍴⍵数组的形状

换句话说,我们创建一个完全为0的数组,在每个维度上都是大于数组的两个元素,然后我们将数组放入该数组(从而替换那些位置中的0),偏移量为1边缘,即在中心。

Try it online!

Alternative version定义at运算符,因此可以在16.0之前使用。

答案 2 :(得分:1)

{r←≢⍴⍵ ⋄ i←1⌽⍳r ⋄ {0⍪0⍪⍨i⍉⍵}⍣r⊢⍵}

⍴⍵阵列的形状
元素的数量(即数组的等级)
r←将其存储为r r ank)

⍳r等级的ɩ次数 1⌽将它们旋转一步 i←存储i i ndices)

阵列上的

⊢⍵
{ ... }⍣r应用以下函数r次(即每个维度一次):
i⍉⍵根据i重新排序参数的轴(即将下一个维度放在前面)
0⍪⍨沿第一轴附加0 0⍪沿第一轴前缀为0

换句话说,每个轴都在前面,我们前置并附加0。

Try it online!

答案 3 :(得分:1)

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

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

⊂⍵将数组包围起来 ( ... ),前面有以下内容:
⍴⍵阵列的形状
元素的数量(即数组的等级)
⍳r等级的ɩ次数 { ... }/使用以下函数减少(在元素之间插入):
⍵,[⍺]0沿着左参数
所示的轴追加0 0,[⍺]⍵沿着左参数
指示的轴前置0 披露(因为减少会将等级从1降低到0,因此必须附上结果)

换句话说,我们依次沿着所有轴前置和附加0。

Try it online!

答案 4 :(得分:0)

所以,我把我的方法推广到一个递归的dfn,它符合我的"适用于任意等级"要求,但我对此并不满意,因为我仍然认为有一种更好的方法可以解决这个问题。我已经把它作为一个答案,因为它在技术上回答了我的问题,但我仍然在寻找更好的解决方案。

{(⍴⍴⍵){⍺=0:⍵ ⋄ (⍺-1)∇0,[⍺]⍨0,[⍺]⍵}⍵}