在numpy 2D数组中查找连续的数字组,在Python中允许两个独立值的最大距离
我有一个非常大的矩阵,需要根据两个标准对数据点进行聚类:在numpy 2D数组中查找连续的数字组,在Python中允许两个独立值的最大距离,python,arrays,numpy,scikit-image,Python,Arrays,Numpy,Scikit Image,我有一个非常大的矩阵,需要根据两个标准对数据点进行聚类: 它们之间的距离不应超过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]
[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中可用:
query-ball-point
方法与您想要的最接近。多大是“非常大”?在两个维度上都可能是一百万左右!KD tree不是看欧几里德距离,而是看每轴距离吗?@Ehsan查询是看欧几里德距离,但是请注意,你的L-无限球半径=3个球(=正方形)包含在半径为3 sqrt(2)的磁盘中,所以请看一下并过滤。太棒了!这就成功了,非常感谢你的回答。它也足够快。@IgorRivin,但这不是将球和正方形之间的点错误地聚集到球中吗?我想不出一个简单的方法来将过滤转换成正确的聚类。