首页 > 解决方案 > 有没有办法使用函数在最密集的点区域上绘制一个最小尺寸的正方形?

问题描述

问题:

使用 NumPy,我创建了一个范围内的随机点数组。

import numpy as np
min_square = 5
positions = (np.random.random(size=(100, 2)) - 0.5) * 2 * container_radius

其中container_radius是一个整数,min_square是一个整数。


之后,我使用 matplotlib 在图表上绘制点。

import matplotlib.pyplot as plt
plt.plot(positions[:, 0], positions[:, 1], 'r.')
plt.show()

这张图向我展示了这些点彼此之间的分布。


我正在寻找的是一种方法来实现类似于或完全是 kd 树的方法,以在散点图的最密集区域上绘制一个矩形,并定义最小的大小。
这将使用plt.gca().add_patch(plt.Rectangle((x, y), width=square_size, height=square_side, fill=Nonewheresquare_side由密度函数定义并且至少是 的最小 sizeo 来完成min_square

解决问题的尝试:

到目前为止,我已经创建了我自己的密度函数,它在我对 Python 的理解范围内,并且很容易编码,而不会使我的计算机过于落后。
解决方法是创建一个额外的预定义变量intervals,它是一个整数。
使用到目前为止,我定义了一个函数来通过检查点是否在浮点范围内来计算密度。

# clb stands for calculate_lower_bound
def clb(x):
    return -1 * container_radius + (x * 2 * container_radius - min_square) / (intervals - 1)

# crd stands for calculate_regional_density
def crd(x, y):
    return np.where(np.logical_and(\
        np.logical_and(positions[:, 0] >= clb(x), positions[:, 0] < clb(x) + min_square),\
        np.logical_and(positions[:, 1] >= clb(y), positions[:, 1] < clb(y) + min_square)))[0].shape[0]

然后,我创建一个大小为 NumPy 的数组, size=(intervals, intervals)并将数组的索引(我对此有另一个问题,因为我目前正在使用一种效率很低的方法)作为输入crd(x,y)并将值存储在另一个名为densities. 然后使用某种方法,我计算densities数组中的最大值并使用一些非常简单的代码绘制矩形,我认为这里没有必要包含这些代码,因为这不是问题。

我在寻找什么:

我正在寻找一些函数,f(x)它计算包含散点图上最密集区域的正方形的尺寸和坐标。该函数可以访问它需要的所有变量,例如positions,min_square等。如果您可以使用信息变量名称或解释每个变量的含义,那也将是一个很大的帮助。

其他(可能)重要说明:

我正在寻找能够在合理的时间内完成工作的东西。在大多数情况下,我将使用大约 10000 个点,我需要计算大约 100 次最密集的区域,因此该函数需要足够高效,以便任务在大约 10-20 秒内完成。
因此,使用像我展示的示例这样的公式的近似值是完全有效的,只要它们实现良好并且能够在必要时增大正方形的尺寸。


谢谢!

标签: pythonarraysdata-visualizationscatter-plotkdtree

解决方案


推荐阅读