如何将包含在多个子圆中的每个点(大数据集)与最小的圆圈相关联?

时间:2018-03-30 04:45:13

标签: python loops iterator counter associative-array

在2d平面上,有一个以(0,0)为中心且半径为Ro的大圆。它包含100个左右的较小圆圈,这些圆圈在父圆圈上随机分布,具有独特的属性(例如半径和位置),每个属性与唯一的整数ID相关联。 (有些较小的子圆可能部分或全部位于较大的子圆内。)

整个平面均匀网格化为像素,边长为水平和垂直(沿坐标轴)。像素的大小是固定的并且是先验已知的,但是远小于父圆的大小;在父圈中有大约10 ^ 5的数量级。

父圆的1%面积以覆盖10 ^ 3像素的父圆的几个团块的形式着色。这些彩色像素大多位于子圆内;所有都完全在父圈内。我们给出了所有彩色网格(的中心)的2D笛卡尔坐标。

每个彩色网格都与包含它的最小子圆相关联。如果像素属于多个子圆圈,则只应选择最小的圆圈。

最后,我想根据上述条件计算与每个子圆相关的彩色网格的总数。要在python中编写它,应该将所有彩色像素存储在2d数组中。然后,对于每个子圆,应该查询该数组以找到该子圆内包含的所有网格。对于每个这样的网格,应该测试它是否在子圆内。如果是,则应将该网格标记为与该子圆相关联,除非它已经与较小的子圆相关联。

这是我的尝试:

totals = {}
sub_circle_catalog = []
for x, y in zip(vals1, vals2):
    enclosing_circles = {}
    for id, position, radius in zip(ids_data, positions_data, radiuss_data): 

        if (np.sqrt(pow(x-position[0], 2)+pow(y-position[1], 2)) < radius):
            enclosing_circles[id] = float('{:.3f}'.format(radius))

            # choose the corresponding ID with the smallest radius here
            smallest_enclosing_circle = min(enclosing_circles, key=enclosing_circles.get)
            sub_circle_catalog.append((enclosing_circles[smallest_enclosing_circle], 1)) 

            # add up all special grids in each sub-circle when looping over all grids
for key, value in sub_circle_catalog:
    totals[key] = totals.get(key, 0) + value

我想知道我是否正确地进行了关联。我不知道如何实现约束,即每个网格只分配给一个子圆圈一次。特别是,如何循环所有特殊网格以计算每个子圈的总预算?

1 个答案:

答案 0 :(得分:0)

找到包含特殊彩色网格的所有子圆后,需要选择最小的子圆。我之所以这么做是错误的,因为它是在所有子圈循环之前完成的。但是,我在此进行的更正是,我确保所有子圈都针对任何单个特殊网格循环,并且在移动到行中的下一个特殊网格之前,我需要断言一条线来处理最小的局部子圆并将其存储到某个列表中。由于每个特殊网格都是这样处理的,所有最小的子圆圈都被添加到空列表中(在开头初始化)。一旦以这种方式调查所有特殊网格,我们就可以将单个贡献的总和添加到空字典中(在开头初始化)。所有这些都在与第一个for语句相同的范围内完成。这是正确的代码:

totals = {}
sub_circle_catalog = []

for x, y in zip(vals1, vals2):
    enclosing_circles = {}

    for id, position, radius in zip(ids_data, positions_data, radiuss_data): 

        if (np.sqrt(pow(x-position[0], 2)+pow(y-position[1], 2)) < radius):
            enclosing_circles[id] = float('{:.4f}'.format(radius))

    # choose the corresponding ID with the smallest radius here
    if enclosing_circles != {}:
        smallest_enclosing_circle = min(enclosing_circles, key=enclosing_circles.get)
        sub_circle_catalog.append((enclosing_circles[smallest_enclosing_circle], 1)) 

# add up all special grids in each sub-circle when looping over all grids
for key, value in sub_circle_catalog:
    totals[key] = totals.get(key, 0) + value

    totals = collections.OrderedDict(sorted(totals.items()))
    totals = list(totals.items())
    with open('/the/path/to/the/file.txt', "a") as my_file:
        print('{}'.format(totals), file=my_file)
        my_file.close()