如何在APL中交错两个给定的向量

5
我正在尝试使用APL解决一个问题,其中我有两个向量v1和v2,其相对长度最多为+1,具体取决于输入。这意味着((≢v1)-(≢v2))∊¯1 0 1。
那么,最好的方法是什么来交错这些向量,以创建第三个向量v3,使得v3=v1[0],v2[0],v1[1],v2[1],...?
(如果相关的话,我正在使用Dyalog APL版本16.0)

我猜你可以把这个问题变得更加通用,通过去掉相对长度部分,因为到目前为止所有的答案都没有考虑它(并支持任何差异)或仅适用于相等长度。 - Uriel
6个回答

10

这应该在几乎所有的 APL 中都可以工作。

(v0,v1)[⍋(⍳⍴v0),⍳⍴v1]

如果你担心v0或v1中任意一个是标量,则

(v0,v1)[⍋(⍳⍴,v0),⍳⍴,v1]

这是最经典的表达之一。非常有用的习语。 - Lobachevsky

7

如果您不介意在向量长度不相等时获得原型填充元素,则

Interleave←{,⍉↑⍵}

我会的。在线尝试! 否则,您可以交错匹配部分,然后附加缺少的元素(对于长度差异大于1的情况也适用):
Interleave←{
    lengths←⌊/≢¨⍵
    main←,⍉↑lengths↑¨⍵
    tail←⊃,/lengths↓¨⍵
    main,tail
}

Try it online!


6

Using a Dyalog dfn:

zip ← {
    mix ← ,⍉↑ ⍺ ⍵
    mask ← ,⍉↑ 1⊣¨¨ ⍺ ⍵
    mask / mix
}

这里的想法是混合两个参数,然后转置结果,并最终扁平化它(mix)。然后,我们将其应用于由给定数组长度(mask)对应的一组1构成的数组上,并将其用作掩码,以过滤由混合原语添加的原型。请注意,这也允许压缩长度差大于一个元素的数组。

在此在线尝试!


5

由于我不了解Dyalog APL,因此我使用上世纪70年代的旧ISO APL进行回答:
(v1,v2)[⍋((0.5×(⍴v1)<⍴v2)+⍳⍴v1),((0.5×(⍴v2)<⍴v1)+⍳⍴v2]

如果两个向量长度相同,则第一个元素将是最长向量的元素;如果两个向量长度不同,则第一个元素将是v1的第一个元素。


如何输入APL符号,请查看以下链接:这里这里这里 - Adám

4

以下是我如何在APL2中解决原始问题的方法:

LEN←∊⌊/⍴¨V1 V2 
V3←∊((LEN↑V1),¨LEN↑V2),LEN↓¨V1 V2

-1

使用长度相同的向量进行内积计算:

 1 2 3,.,40 50 60

┌──────────────┐
│1 40 2 50 3 60│
└──────────────┘

在此基础上构建会产生这个 dfn :

{r←(⍴⍺)⌊⍴⍵⋄(∊(r⍴⍺),.,r⍴⍵),(r↓⍺),r↓⍵}

或者,我们可以进行层压(保持相同的总体逻辑):

{r←(⍴⍺)⌊⍴⍵⋄(,(r⍴⍺),⍪r⍴⍵),(r↓⍺),r↓⍵}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接