【问题标题】:Sum of each two elements using vector functions使用向量函数对每两个元素求和
【发布时间】:2021-03-27 10:10:43
【问题描述】:

如何用向量函数得到两个元素的总和?我想要与以下相同的结果:

{x+y}':[1 2 3 2 1]

为什么这种方法提供的东西与第一种不同?

sum':[1 2 3 2 1]

【问题讨论】:

    标签: kdb k


    【解决方案1】:

    sum{x+y} 不同。

    sum 排名为 1,这意味着它接受一个输入并将该输入的元素相加。

    它可以对一个原子求和:

    q)sum 1
    1
    

    统一列表

    q)sum 1 2
    3
    

    或列表列表

    q)sum(1 2;3 4)
    4 6
    

    {x+y} 排名第 2,这意味着它需要两个输入。

    q){x+y}[1;2]
    3
    q){x+y}[1 2;3 4]
    4 6
    

    给它一个原子、单个列表或列表列表会导致投影

    q){x+y}1
    {x+y}[1]
    q){x+y}1 2
    {x+y}[1 2]
    q){x+y}(1 2;3 4)
    {x+y}[(1 2;3 4)]
    

    由于 each-prior (':) 从输入创建二进制对并尝试应用 rank 2 函数,因此它在您的 rank 2 函数 {x+y} 上按预期工作。

    但由于 sum 不是 2 级,each-prior 不会以相同的方式生成对,这相当于做

    q){x}':[1 2 3 2 1]
    1 2 3 2 1
    q){sum x}':[1 2 3 2 1]
    1 2 3 2 1
    

    您可以将其强制为 2 级:

    q){sum(x;y)}':[1 2 3 2 1]
    1 3 5 5 3
    

    但这会给出不同的结果,因为sum 会忽略空值,而+ 不会。

    q)sum(0N;1)
    1
    q)0N+1
    0N
    

    最后,使用 sum(并且不使用 each-prior)实现此目的的另一种方法是使用 prev 移动向量,然后使用 sum

    q){sum(prev x;x)}[1 2 3 2 1]
    0N 3 5 5 3
    

    【讨论】:

    • 只要知道sum 充当v1 强制': 充当每个并行而不是每个先验。谢谢你,特里!
    • 是的,好点子!这比我解释得更好哈
    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    相关资源
    最近更新 更多