代码之家  ›  专栏  ›  技术社区  ›  tenticon

kdb q-为正整数创建2d存储桶

kdb
  •  0
  • tenticon  · 技术社区  · 7 年前

    我正在尝试在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)

    但它返回索引 8

    谢谢你的帮助

    2 回复  |  直到 7 年前
        1
  •  1
  •   Rahul    7 年前

    那是因为垃圾箱的行为。

    二进制搜索返回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
    

    您可以使用类似于下面的想法。函数的第一个参数是X坐标,第二个参数是Y坐标。

     q) node:{b:0 3 5;(b bin x)+3*b bin y}
     q) node[0;6] / 6
    
        2
  •  0
  •   terrylynch    7 年前

    另一种方法是使用具有排序属性的字典,这使它成为一个step函数。

    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
    
    推荐文章