python - 在没有 for 循环的情况下获取到 1D/2D 中每个最近元素的距离

标签 python pandas numpy

我正在使用 numpy(也可能是 pandas 系列)在 python 中工作,并且正在尝试进行以下计算:

假设我有一个对应于 x 轴上的点的数组:

2, 9, 5, 6, 55, 8

对于这个数组中的每个元素,我想获取到最近元素的距离,因此输出如下所示:

3, 1, 1, 1, 46, 1

我正在尝试找到一种可以缩放到 2D(到最近的 XY 点的距离)的解决方案,并且理想情况下会避免 for 循环。这可能吗?

最佳答案

这里似乎有一个 O(N^2) 解决方案的主题。对于 1D,得到 O(N log N) 非常简单:

x = np.array([2, 9, 5, 6, 55, 8])
i = np.argsort(x)
dist = np.diff(x[i])
min_dist = np.r_[dist[0], np.minimum(dist[1:], dist[:-1]), dist[-1]])
min_dist = min_dist[np.argsort(i)]

这显然不能很好地扩展到多个维度,所以使用 scipy.special.KDTree反而。假设您的数据是 N 维的并且具有形状 (M, N),您可以这样做

k = KDTree(data)
dist = k.query(data, k=2)[0][:, -1]

Scipy 有一个 KDTree 的 Cython 实现,cKDTree . Sklearn 有一个 sklearn.neighbors.KDTree也有类似的界面。

关于python - 在没有 for 循环的情况下获取到 1D/2D 中每个最近元素的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64234972/

相关文章:

python - 在 python 中复制时排除一些子文件夹(我使用 copytree)

python - 在 3D 空间中生成具有最小最近邻距离的随机点

python - pandas iterrows 抛出错误

python - 将 Anaconda MKL 链接到 C++/Cython 程序

python - 我沿着椭圆形有一组点。如何创建填充的二进制掩码

带逗号/列表的 Python 切片表示法

python - 在 Model.get_by_id() 上出现 "Expected string, got None"错误

python - scikit-learn:如何缩减 'y' 的预测结果

python - 如何根据另一列中的值在数据框中设置零和一

python - 如何删除数据框中的异构元素?