最有效的方法来删除指定区域中的x,y坐标

时间:2014-03-04 21:23:10

标签: python python-2.7 numpy

我有两个x和y坐标数组:

x = np.round(np.arange(-4.67,-1.32,0.01),2)
y = np.round(np.arange(-3.32,3.32,0.01),2)

我正在使用这些数组在指定范围内随机绘制.65宽度/高度的正方形,这表示象限左侧的区域。这些值表示视觉度数与0之间的距离,x,y对是方形居中的距离。以下是我随机选取坐标的方法:

x1, y1 = random.choice(x), random.choice(y)
position1 = np.append(x1,y1)

问题在于有时候要绘制多个正方形,并且它们不能重叠。必须在定义区域内的正方形之间保持2度(中心到中心)的最小距离。

我考虑过创建一个包含该区域内所有可能坐标对的数组:

coords = np.array(list(itertools.product(x,y))

然后我可以从该数组中随机选择一对,生成另一个以该对为中心的方形区域中所有坐标点的数组,并从 coords 中删除它们。这将确保在该正方形的2度内不能绘制其他正方形。我想这可以用于多个方格。

这会产生一些大规模阵列。此代码在PsychoPy(实验构建器)中运行,因此将这些坐标分配给正方形非常重要。完成此任务的最有效方法是什么?也许有一个更明显的方法,我错过了?

1 个答案:

答案 0 :(得分:1)

您可以使用网格地图进行快速检查。

当您选择一个点时,如果有任何其他点太近,则仅检查网格中的附近单元格,否则您接受该点并将该点添加到网格中:

grid = {}
points = []

def addPoint(x, y):
    # returns True if the point was accepted

    # compute the cell of the point
    ix = int(math.floor(x / dist))
    iy = int(math.floor(y / dist))

    # check cell and all neighbors
    for nhcell in ((ix-1, iy-1), (ix, iy-1), (ix+1, iy-1),
                   (ix-1,  iy ), (ix,  iy ), (ix+1,  iy ),
                   (ix-1, iy+1), (ix, iy+1), (ix+1, iy+1)):
        if nhcell in grid:
            for xx, yy in grid[nhcell]:
                if (x - xx)**2 + (y - yy)**2 < dist2:
                    # anoter existing point is too close
                    return False

    # the new point is fine
    points.add((x, y))

    # we should also add it to the grid for future checks
    if (ix, iy) in grid:
        grid[(ix, iy)].append((x, y))
    else:
        grid[(ix, iy)] = [(x, y)]

    return True