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

Python在2D数据上应用网格,将非空网格单元保存在树中,python,tree,Python,Tree,我有一个2D中约500个点的数据集,具有给定的坐标(也意味着我可以用一个整数引用每个点)(x,y)介于0和10之间。现在,我试图通过应用网格将该区域划分为规则的正方形单元。请注意,这个过程在一个算法中重复,在某个点上会有>>>500个方形单元 我想要实现的是:在所有点上循环,对于每个点,找到点所在的方形单元格并保存此信息。 几步之后:再次在所有点上循环,为每个点标识其单元和单元的相邻单元。获取这些单元格的所有点,并将其添加到列表中,以便进一步使用 我的思考过程:因为会有很多空单元格,我不想为它们

我有一个2D中约500个点的数据集,具有给定的坐标(也意味着我可以用一个整数引用每个点)(x,y)介于0和10之间。现在,我试图通过应用网格将该区域划分为规则的正方形单元。请注意,这个过程在一个算法中重复,在某个点上会有>>>500个方形单元

我想要实现的是:在所有点上循环,对于每个点,找到点所在的方形单元格并保存此信息。
几步之后:再次在所有点上循环,为每个点标识其单元和单元的相邻单元。获取这些单元格的所有点,并将其添加到列表中,以便进一步使用

我的思考过程:因为会有很多空单元格,我不想为它们浪费内存,所以使用一棵树。
示例:在单元格_39_41和单元格_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,我觉得它们太多了,不适合

使用dict of dict作为树:

tree = {
    '_data': 123,
    'node1': {
        '_data': 456,
        'node11': {
           'node111': {}
        },
    'node2': {
    }
}
搜索字典很快

tree['node1']['node12']['node123']['_data'] = 123 # adding
唯一名称:

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

将dict的dict用作目录树:

tree = {
    '_data': 123,
    'node1': {
        '_data': 456,
        'node11': {
           'node111': {}
        },
    'node2': {
    }
}
搜索字典很快

tree['node1']['node12']['node123']['_data'] = 123 # adding
唯一名称:

shortcuts = {}
shortcuts['name'] = tree['node1']['node11']['node111']
print shortcuts['name']['_data']
这个怎么样

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
这个怎么样

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

好了。以前从未使用过dict,但它似乎非常适合。非常感谢!好了。以前从未使用过dict,但它似乎非常适合。非常感谢!谢谢你,伙计。我已经开始用第一个答案来实现它,这就是为什么他的答案被切换的原因。我以后一定也会看看这个的。谢谢你。我已经开始用第一个答案来实现它,这就是为什么他的答案被切换的原因。我一定会晚些时候再看这个。