用空值替换无穷大,然后使用q kdb中的填充值填充它们

用空值替换无穷大,然后使用q kdb中的填充值填充它们,kdb,Kdb,我在进行填充解释时遇到了以下示例:即,如果有无穷大,则将其替换为null,然后使用填充填充 q)fills {(x where x=0W):0N;x} 0N 2 3 0W 0N 7 0W Output - 0N 2 3 3 3 7 7 我想进一步扩展这个问题,如果输出中的第一个值为Null,那么用默认值1填充它,我已经为此编写了两个版本的解决方案 {(x where x=0N):1;x} fills {(x where x=0W):0N;x} 0N 2 3 0W 0N 20 30 0W 1^f

我在进行填充解释时遇到了以下示例:即,如果有无穷大,则将其替换为null,然后使用填充填充

q)fills {(x where x=0W):0N;x} 0N 2 3 0W 0N 7 0W
Output - 0N 2 3 3 3 7 7
我想进一步扩展这个问题,如果输出中的第一个值为Null,那么用默认值1填充它,我已经为此编写了两个版本的解决方案

{(x where x=0N):1;x} fills {(x where x=0W):0N;x} 0N 2 3 0W 0N 20 30 0W
1^fills {(x where x=0W):0N;x} 0N 2 3 0W 0N 20 30 0W /- Output - 1 2 3 3 3 20 30 30
这两个版本中哪一个是优化版(我认为这是第二个使用fill的版本)?

有更好的/优化的版本吗?

您总是可以通过为大向量计时来测试解决方案

q)\ts {(x where x=0N):1;x} fills {(x where x=0W):0N;x}10000000#0N 2 3 0W 0N 20 30 0W
196 553649552

q)\ts 1^fills {(x where x=0W):0N;x}10000000#0N 2 3 0W 0N 20 30 0W
190 553649216
对于大向量,您应该通过仅用1填充第一项来获得一点改进,假设您只需要默认为1

q)@[;0;1^]fills {(x where x=0W):0N;x}0N 2 3 0W 0N 20 30 0W
1 2 3 3 3 20 30 30
但是,如果您在开始时有一系列空值(而不仅仅是一个),那么这将不会有帮助

q)@[;0;1^]fills {(x where x=0W):0N;x}0N 0N 2 3 0W 0N 20 30 0W
1 0N 2 3 3 3 20 30 30

在这种情况下,最好在整个向量上使用
1^

将1添加到无穷大将其转换为null

q)0W 10 0N+1
0N 11 0N
为了保留原始值和空值,让我们从结果列表中减去1

q)-1+0W 10 0N+1
0N 10 0N
填充可以接受两个参数(如果您给它两个参数,则起始数字为x)

因此,为了满足您的需求,将其放在一起

q)fills[1;] -1+x+1
1 2 3 3 3 20 30 30 30 2 3 3 3 20 30 30 30 2 3 3 3 20 30 30 30 2 3 3 3 20 30 3..
嗯,,
肖恩

这是一个惊人的解决方案。谢谢!
q)fills[1;] -1+x+1
1 2 3 3 3 20 30 30 30 2 3 3 3 20 30 30 30 2 3 3 3 20 30 30 30 2 3 3 3 20 30 3..