嗨所以我创建了嵌套列表/矩阵:
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
答案 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;]
表示行x
而m[;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