用新列表元素替换嵌套列表的中间行元素Q kdb

时间:2017-11-06 11:18:25

标签: list matrix indexing replace kdb

嗨所以我创建了嵌套列表/矩阵:

 q)m:((1 2 3);(4 5 6);(7 8 9))
 q)m
 1 2 3
 4 5 6
 7 8 9

我还确定了列表中的中间栏:

q)a:m[0;1],m[1;1],m[2;1]

我现在想用(4 5 6)替换中间行a以完成m,如下所示:

q)m
1 2 3
2 5 8
7 8 9 

5 个答案:

答案 0 :(得分:2)

您已经看到,您可以使用m[0;1]等语法索引矩阵,其中0表示第一级嵌套,1表示第二级

KDB还允许您以类似的方式分配列表的索引,例如。

q)l:1 2 3 4
q)l[1]:20
q)l
1 20 3 4

所以你可以在这个例子中使用类似的东西:

q)m[1]:a
q)m
1 2 3
2 5 8
7 8 9

另外,KDB还允许您省略索引,在这种情况下,它将从相应的嵌套级别获取所有项目,例如。

q)m[0]  /first level of nesting i.e. first row
1 2 3
q)m[;0] /second level of nesting i.e. first column
1 4 7

希望有所帮助

乔纳森麦克默里

AquaQ Analytics

答案 1 :(得分:1)

你想要推广更大的矩阵(也必须是正方形),所以你的答案需要两个部分:

  • 如何构建a
  • 如何插入

for row / col x其中x<count m

您想要的通用表达式只是m[x;]:m[;x],因为m[x;]表示行xm[;x]表示列x

参见 Q for Mortals 3.11.3 Two- and Three-Dimensional Matrices

你可以将它作为索引和矩阵的函数:

q)show m:5 5#1_til 26
1  2  3  4  5 
6  7  8  9  10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
q){y[x;]:y[;x];:y}[3;m]
1  2  3  4  5 
6  7  8  9  10
11 12 13 14 15
4  9  14 19 24
21 22 23 24 25

答案 2 :(得分:0)

为您添加另一种方法。

q)m:8 cut til 64
q)0 0+\:til 8
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
q)(m)./:flip 0 0+\:til 8
0 9 18 27 36 45 54 63
q)@[m;4;:;(m)./:flip 0 0+\:til 8]
0  1  2  3  4  5  6  7 
8  9  10 11 12 13 14 15
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
0  9  18 27 36 45 54 63
40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63
q)

为了好玩,这里有一个功能,它取矩阵的长度和宽度,取代了中间的&#39;具有对角线值的行

q){n:x*x;m:x cut til n;@[m;x div 2;:;](m)./:flip 0 0+\:til x}8
0  1  2  3  4  5  6  7 
8  9  10 11 12 13 14 15
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
0  9  18 27 36 45 54 63
40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63
q){n:x*x;m:x cut til n;@[m;x div 2;:;](m)./:flip 0 0+\:til x}5
0  1  2  3  4 
5  6  7  8  9 
0  6  12 18 24
15 16 17 18 19
20 21 22 23 24
q){n:x*x;m:x cut til n;@[m;x div 2;:;](m)./:flip 0 0+\:til x}4
0  1  2  3 
4  5  6  7 
0  5  10 15
12 13 14 15
q)

答案 3 :(得分:0)

q)@ [((1 2 3);(4 5 6);(7 8 9)); 1;:;(2; 5; 8)] 1 2 3 2 5 8 7 8 9

答案 4 :(得分:0)

q中的索引可以直截了当,我相信中间词可以省略:

q)m:((1 2 3);(4 5 6);(7 8 9))
q)m[1]:m[;1]
q)m
1 2 3
2 5 8
7 8 9