Python在2D数据上应用网格,在树中保存非空网格单元

时间:2012-06-11 12:18:22

标签: python tree

我在2D中有一个约500个点的数据集,给定的坐标(也暗示我可以用0到10之间的单个整数引用每个点)(x,y)。现在我试图划分通过应用网格将区域划分为正方形单元格。请注意,此过程在算法中重复进行,并且在某些时候将有>>>> 500平方单元格。

我想要实现的目标:遍历所有点,为每个点找到该点所在的方形单元并保存此信息。
 几步之后:再次遍历所有点,每个点识别其单元格和单元格的相邻单元格。取这些细胞的所有点并将它们添加到例如列表,供进一步使用。

我的思维过程:由于会有很多空单元格而且我不想为它们浪费记忆,所以请使用树。
示例:在cell_39_41中,cell_39_42是一个点。 第一级:带子39的根节点 第二级:39个孩子节点41,42
第三级:带有子点1的41节点和带有子点2的42节点 第四级:代表实际点的节点
如果我在cell_39_41或cell_39_42中找到更多的点,它们将被添加为各自的第三级节点的子节点。

class Node(object):

def __init__(self, data):
    self.data = data
    self.children = []

def add_child(self, obj):
    self.children.append(obj)

我遗漏了一个不相关的方法来返回单元格中的点。

此实施的问题:
1.如果我添加第二级或第三级节点,我将不得不引用它来添加子节点或在某个单元格及其相邻单元格中查找点。这意味着我必须进行大量昂贵的线性搜索,因为子列表没有排序 2.我将添加数百个节点,但我需要能够通过唯一的名称来引用它们。这可能是一个很大的个人失败,但我想不出一种在循环中生成这些名称的方法。

所以我基本上我很确定在我的思考过程中有些错误,或者树的使用实现可能不合适。我已经阅读了很多b树或类似的实现,但由于这个问题仅限于2D,我觉得它们太多而且不适合。

2 个答案:

答案 0 :(得分:2)

这个怎么样......

def add_point(data_dict, row, column, point):
    # modifies source of data_dict in place, since dictionaries are mutable
    data_dict.setdefault(row, {}).setdefault(column, []).append(point)

def get_table(data):
    out_dict = {}
    for row, column, point in data:
        add_point(out_dict, row, column, point)
    return out_dict


if __name__ == "__main__":
    data = [(38, 41, 38411), (39, 41, 39411), (39, 42, 39421)]
    points = get_table(data)    
    print points    
    add_point(points, 39, 42, 39422)    
    print points

答案 1 :(得分:1)

使用dicts的词典作为树:

tree = {
    '_data': 123,
    'node1': {
        '_data': 456,
        'node11': {
           'node111': {}
        },
    'node2': {
    }
}

在dicts中搜索速度很快!

tree['node1']['node12']['node123']['_data'] = 123 # adding

唯一名称:

shortcuts = {}
shortcuts['name'] = tree['node1']['node11']['node111']
print shortcuts['name']['_data']