【发布时间】:2021-07-10 13:55:42
【问题描述】:
我有一个坐标列表a。我想指定半径r,然后列出a 中任意点的指定半径内的二维网格上的所有点,以及每个网格点到a 中任意点的最小距离。由于a 很大(~1000-2000 点),我希望尽可能高效。
到目前为止,我的实现使用this code 列出给定点半径内的所有坐标;然后迭代a中的所有坐标;然后展平输出,取一个集合(会有很多重复) - 这是在线上任意点的指定半径内的一组坐标 - 然后使用 scipy.spatial.distance.cdist 计算该集合到 a 的最小距离:
import numpy as np
np.random.seed(123)
a = np.random.randint(50, size=(100, 2))
def collect(coord, sigma: float =3.0):
""" create a small collection of points in a neighborhood of some point
"""
neighborhood = []
x=coord[0]
y=coord[1]
X = int(sigma)
for i in range(-X, X + 1):
Y = int(pow(sigma * sigma - i * i, 1/2))
for j in range(-Y, Y + 1):
neighborhood.append((x + i, y + j))
return neighborhood
rad = 10
coord_list = [collect(coord, rad) for coord in a]
coord_set = np.array(list(set([val for sublist in coord_list for val in sublist])))
from scipy.spatial import distance
dists = distance.cdist(coord_set, a).min(axis=1)
结果:
coord_set
> array([[26, 21],
[18, 17],
[50, 6],
...,
[14, 47],
[15, 12],
[ 7, 8]])
dists
> array([2.23606798, 5.65685425, 1.41421356, ..., 3.16227766, 3. ,
1.41421356])
有没有人有什么办法可以改善这一点并更有效地做到这一点?
【问题讨论】:
-
出于好奇:这条线的描述是什么?这是你有的功能吗?或者
a中的某种定义? -
@LeoE。看起来像是代码中的随机数集合。不是一条线
-
@MadPhysicist 是的,但是当 OP 谈到“我有一条线(不是直线)时,坐标包含在 a 中。”我假设,除了随机的坐标集之外,还存在一条线?还是我误会了什么?
-
你能画出你正在寻找的东西吗?
a似乎是随机点的集合。你的散文不太清楚网格是什么以及你想要做什么。 -
@LeoE。我很确定“线”应该是“点的集合”。我不认为它有更深层次的含义。