(Dyalog)APL中有一个简单的成语用零包围数字数组吗?
目前,对于排名为1的数值数组NA
,或使用
0,⍨0, NA
对于排名为2的数组我使用
0,[1]⍨0,[1]0,⍨0, NA
对于更高级别我可以重复这个模式,但我确信必须有一个更好的方法来做到这一点(并且对所有级别都有一个定义),但是我不能想出一个没有看起来过于复杂。
答案 0 :(得分:2)
答案 1 :(得分:1)
此Dyalog APL 16.0版解决方案(来自here)处理任意数量的维度:
{⍵@(1+⍳⍴⍵)⊢0⍴⍨2+⍴⍵}
⍵
数组
@(
置于
1+
一加
⍳
⍴⍵
数组的形状
)⊢
在由
0⍴⍨
零重塑为形状
2+
两个添加到
⍴⍵
数组的形状
换句话说,我们创建一个完全为0的数组,在每个维度上都是大于数组的两个元素,然后我们将数组放入该数组(从而替换那些位置中的0),偏移量为1边缘,即在中心。
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。
答案 3 :(得分:1)
回应你自己的答案;你可以减少而不是递归:
{⊃{0,[⍺]⍵,[⍺]0}/(⍳≢⍴⍵),⊂⍵}
⊂⍵
将数组包围起来
(
... ),
前面有以下内容:
⍴⍵
阵列的形状
≢
元素的数量(即数组的等级)
⍳r
等级的ɩ次数
{
... }/
使用以下函数减少(在元素之间插入):
⍵,[⍺]0
沿着左参数
所示的轴追加0
0,[⍺]⍵
沿着左参数
指示的轴前置0
⊃
披露(因为减少会将等级从1降低到0,因此必须附上结果)
换句话说,我们依次沿着所有轴前置和附加0。
答案 4 :(得分:0)
所以,我把我的方法推广到一个递归的dfn,它符合我的"适用于任意等级"要求,但我对此并不满意,因为我仍然认为有一种更好的方法可以解决这个问题。我已经把它作为一个答案,因为它在技术上回答了我的问题,但我仍然在寻找更好的解决方案。
{(⍴⍴⍵){⍺=0:⍵ ⋄ (⍺-1)∇0,[⍺]⍨0,[⍺]⍵}⍵}