python - 在没有 for 循环的情况下获取到 1D/2D 中每个最近元素的距离
问题描述
我正在使用 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 维的并且具有 shape (M, N)
,您可以这样做
k = KDTree(data)
dist = k.query(data, k=2)[0][:, -1]
Scipy 有一个 Cython 实现KDTree
,cKDTree
. Sklearn 也有sklearn.neighbors.KDTree
类似的界面。
推荐阅读
- ionic-framework - 如何在 Popover 中放置 Tabs
- java - 使用 json-schema-validator 评估 JSON 文件模式
- angular-material - 角度材料表单验证和错误未正确显示
- javascript - 我怎样才能使这个倒计时适用于其他时区?
- apache-spark - 由于 SparkContext 已关闭,作业被取消
- html - 如何更改主页类别文本的颜色?
- react-native - 更新类型阴影节点中的属性“宽度”时出错:RNSVGsvgView
- jquery - jquery在克隆中选择了选项
- go - 时间格式化程序的输出不正确
- apache - 如何在 httpd 中重定向 url