在允许最大值的 numpy 二维数组中查找连续的数字组。 Python 中两个独立值的距离
Find continuous groups of numbers in a numpy 2D array allowing a max. distance on two independent values in Python
我有一个非常大的矩阵,我需要根据两个标准对数据点进行聚类:
- 它们在 x 轴上的距离不应超过 3 以形成一个簇
- 它们在 y 轴上的距离也不应超过 3 个以形成一个簇。
例如矩阵中的以下数据点:
[14, 282681]
[14, 282680]
[21, 176161]
[22, 176162]
[37, 273403]
[37, 273443]
[41, 207638]
它们应该分为:
{1: [[14, 282681][14, 282680]],
2: [[21, 176161],[22, 176162]],
3: [[37, 273403],
4: [[37, 273443]]],
在一维数组上只做 1) 是微不足道的,因为可以对数组进行排序,然后每次间隙大于 3 时插入一个中断。到目前为止,我已经尝试过列表理解。
但是同时在两个轴上结合这两个标准确实让我有点头疼。
如果我先根据 x 轴对它进行排序,然后根据大于 3 的间隙对其进行分割,然后在 y 轴上重复该过程,数据就会变得一团糟。
我试图将数据点插入矩阵并在其上应用连接的组件标签。它有效,但速度很慢。我想知道是否有更快、更优雅的方法来解决这个问题?
第一个问题是您的问题没有明显的唯一解决方案 - 有很多方法可以对数据进行分区以满足您的约束。除此之外,我认为你真正想要的是为你的数据生成一个 K-d 树(在你的例子中,K=2),它会做你需要的。这在 scipy 中可用:https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.KDTree.html 并且 query-ball-point
方法最符合您的要求。
我有一个非常大的矩阵,我需要根据两个标准对数据点进行聚类:
- 它们在 x 轴上的距离不应超过 3 以形成一个簇
- 它们在 y 轴上的距离也不应超过 3 个以形成一个簇。
例如矩阵中的以下数据点:
[14, 282681]
[14, 282680]
[21, 176161]
[22, 176162]
[37, 273403]
[37, 273443]
[41, 207638]
它们应该分为:
{1: [[14, 282681][14, 282680]],
2: [[21, 176161],[22, 176162]],
3: [[37, 273403],
4: [[37, 273443]]],
在一维数组上只做 1) 是微不足道的,因为可以对数组进行排序,然后每次间隙大于 3 时插入一个中断。到目前为止,我已经尝试过列表理解。 但是同时在两个轴上结合这两个标准确实让我有点头疼。 如果我先根据 x 轴对它进行排序,然后根据大于 3 的间隙对其进行分割,然后在 y 轴上重复该过程,数据就会变得一团糟。 我试图将数据点插入矩阵并在其上应用连接的组件标签。它有效,但速度很慢。我想知道是否有更快、更优雅的方法来解决这个问题?
第一个问题是您的问题没有明显的唯一解决方案 - 有很多方法可以对数据进行分区以满足您的约束。除此之外,我认为你真正想要的是为你的数据生成一个 K-d 树(在你的例子中,K=2),它会做你需要的。这在 scipy 中可用:https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.KDTree.html 并且 query-ball-point
方法最符合您的要求。