kdb q - 为正整数创建二维桶
kdb q - create 2d buckets for positive integers
我正在尝试在 q
中创建 2d 桶
给定一个二维网格
5 o---o---o
| | |
3 o---o---o
| | |
0 o---o---o
0 3 5
网格上的每个节点都定义了正整数的二维桶的边界。例如,中心节点将包含元组 (x;y)
,其中 3<=x<5
和 3<=y<5
。九个桶的索引来自 0,...,8
.
我尝试在 q 中实现的方法是
bucketidx:{((0 3 5i) cross (0 3 5i)) bin "i"$(first x;last x)}
遍历桶:
bucketidx each ((0 3 5i) cross (0 3 5i))
/0j, 1j, 2j, 3j, 4j, 5j, 6j, 7j, 8j
但是我在 bucketidx 6 0
上遇到了一个奇怪的行为。我希望它在左上角节点
(5<=y) and (x=0)
但它 returns 索引 8
这将是右上角的节点。我希望很清楚我想做什么。
感谢帮助
那是因为 bin 行为。
二分查找 returns x 中最后一项的索引 <=y
https://code.kx.com/q/ref/search/#bin-binr
您的名单是:
q) a:(0 3 5i) cross (0 3 5i)
q) a / (0 0; 0 3;0 5;3 0; 3 3; 3 5;5 0;5 3; 5 5)
您正在使用 bin 函数在此列表中搜索 (6 0),该列表中 <=(6;0) 的最后一项是 (5;5),该项目的索引是 8。
q) a bin 6 0 / 8
这就是你得到 8 的原因。
我认为 'tuple with bin' 方法不是解决这个问题的正确方法。
您可以使用类似于以下想法的东西。函数的第一个参数是 X 坐标,第二个参数是 Y 坐标。
q) node:{b:0 3 5;(b bin x)+3*b bin y}
q) node[0;6] / 6
另一种方法是使用具有 sorted 属性的字典,这使它成为一个阶跃函数。
q)d:`s#0 3 5!0 1 2
q)3 sv' d@(0 3 5i) cross (0 3 5i)
0 1 2 3 4 5 6 7 8
q)3 sv' d@enlist 6 0
,6
我正在尝试在 q
中创建 2d 桶给定一个二维网格
5 o---o---o
| | |
3 o---o---o
| | |
0 o---o---o
0 3 5
网格上的每个节点都定义了正整数的二维桶的边界。例如,中心节点将包含元组 (x;y)
,其中 3<=x<5
和 3<=y<5
。九个桶的索引来自 0,...,8
.
我尝试在 q 中实现的方法是
bucketidx:{((0 3 5i) cross (0 3 5i)) bin "i"$(first x;last x)}
遍历桶:
bucketidx each ((0 3 5i) cross (0 3 5i))
/0j, 1j, 2j, 3j, 4j, 5j, 6j, 7j, 8j
但是我在 bucketidx 6 0
上遇到了一个奇怪的行为。我希望它在左上角节点
(5<=y) and (x=0)
但它 returns 索引 8
这将是右上角的节点。我希望很清楚我想做什么。
感谢帮助
那是因为 bin 行为。
二分查找 returns x 中最后一项的索引 <=y
https://code.kx.com/q/ref/search/#bin-binr
您的名单是:
q) a:(0 3 5i) cross (0 3 5i)
q) a / (0 0; 0 3;0 5;3 0; 3 3; 3 5;5 0;5 3; 5 5)
您正在使用 bin 函数在此列表中搜索 (6 0),该列表中 <=(6;0) 的最后一项是 (5;5),该项目的索引是 8。
q) a bin 6 0 / 8
这就是你得到 8 的原因。
我认为 'tuple with bin' 方法不是解决这个问题的正确方法。
您可以使用类似于以下想法的东西。函数的第一个参数是 X 坐标,第二个参数是 Y 坐标。
q) node:{b:0 3 5;(b bin x)+3*b bin y}
q) node[0;6] / 6
另一种方法是使用具有 sorted 属性的字典,这使它成为一个阶跃函数。
q)d:`s#0 3 5!0 1 2
q)3 sv' d@(0 3 5i) cross (0 3 5i)
0 1 2 3 4 5 6 7 8
q)3 sv' d@enlist 6 0
,6