Python 解析x、y坐标列表并检测连续区域

Python 解析x、y坐标列表并检测连续区域,python,math,Python,Math,我有一个x,y坐标的列表 我需要做的是将它们分成连续的区域组 列表中的所有x,y坐标最终都将属于特定的组 我现在有一个简单的算法,它只需要遍历每个点,找到所有相邻的点,即x上坐标为+-1,y上坐标为+-1的点 但是,在使用大x,y列表时,速度太慢了 记住组中可能有孔。 可以使用的一种简单方法是。k-means将观察列表划分为k个簇,其中每个点都属于具有最近平均值的簇。如果你知道有k=2组点,那么这个方法应该很有效,假设你的点簇是合理地分开的,即使它们有洞。这应该很容易应用 下面是您可以执行的分析

我有一个x,y坐标的列表

我需要做的是将它们分成连续的区域组

列表中的所有x,y坐标最终都将属于特定的组

我现在有一个简单的算法,它只需要遍历每个点,找到所有相邻的点,即x上坐标为+-1,y上坐标为+-1的点 但是,在使用大x,y列表时,速度太慢了


记住组中可能有孔。

可以使用的一种简单方法是。k-means将观察列表划分为k个簇,其中每个点都属于具有最近平均值的簇。如果你知道有k=2组点,那么这个方法应该很有效,假设你的点簇是合理地分开的,即使它们有洞。这应该很容易应用

下面是您可以执行的分析类型的示例

# import required modules
import numpy as np
from scipy.cluster.vq import kmeans2

# generate clouds of 2D normally distributed points
N = 6000000 # number of points in each cluster

# cloud 1: mean (0, 0)
mean1 = [0, 0]
cov1  = [[1, 0], [0, 1]]
x1,y1 = np.random.multivariate_normal(mean1, cov1, N).T

# cloud 2: mean (5, 5)
mean2 = [5, 5]
cov2  = [[1, 0], [0, 1]]
x2,y2 = np.random.multivariate_normal(mean2, cov2, N).T

# merge the clouds and arrange into data points
xs, ys = np.concatenate( (x1, x2) ), np.concatenate( (y1, y2) )
points = np.array([xs, ys]).T

# cluster the points using k-means
centroids, clusters = kmeans2(points, k=2)
在我2012年的MBA课程中,使用1200万个数据点运行此功能非常快:

>>> time python test.py

real    0m20.957s
user    0m18.128s
sys     0m2.732s
鉴于点云完全不重叠,这也就不足为奇了。下面是一些计算集群分配准确性的快速代码。唯一棘手的部分是我首先使用欧几里德距离来确定哪个簇的质心与原始数据云的平均值相匹配

# determine which centroid belongs to which cluster
# using Euclidean distance
dist1 = np.linalg.norm(centroids[0]-mean1)
dist2 = np.linalg.norm(centroids[1]-mean1)
if dist1 <= dist2:
    FIRST, SECOND = 0, 1
else:
    FIRST, SECOND = 1, 0

# compute accuracy by iterating through all 2N points
# note: first N points are from cloud1, second N points are from cloud2
correct = 0
for i in range(len(clusters)):
    if clusters[i] == FIRST and i < N:
        correct += 1    
    elif clusters[i] == SECOND and i >= N:
        correct += 1

# output accuracy
print 'Accuracy: %.2f' % (correct*100./len(clusters))

您可以使用的一个简单方法是。k-means将观察列表划分为k个簇,其中每个点都属于具有最近平均值的簇。如果你知道有k=2组点,那么这个方法应该很有效,假设你的点簇是合理地分开的,即使它们有洞。这应该很容易应用

下面是您可以执行的分析类型的示例

# import required modules
import numpy as np
from scipy.cluster.vq import kmeans2

# generate clouds of 2D normally distributed points
N = 6000000 # number of points in each cluster

# cloud 1: mean (0, 0)
mean1 = [0, 0]
cov1  = [[1, 0], [0, 1]]
x1,y1 = np.random.multivariate_normal(mean1, cov1, N).T

# cloud 2: mean (5, 5)
mean2 = [5, 5]
cov2  = [[1, 0], [0, 1]]
x2,y2 = np.random.multivariate_normal(mean2, cov2, N).T

# merge the clouds and arrange into data points
xs, ys = np.concatenate( (x1, x2) ), np.concatenate( (y1, y2) )
points = np.array([xs, ys]).T

# cluster the points using k-means
centroids, clusters = kmeans2(points, k=2)
在我2012年的MBA课程中,使用1200万个数据点运行此功能非常快:

>>> time python test.py

real    0m20.957s
user    0m18.128s
sys     0m2.732s
鉴于点云完全不重叠,这也就不足为奇了。下面是一些计算集群分配准确性的快速代码。唯一棘手的部分是我首先使用欧几里德距离来确定哪个簇的质心与原始数据云的平均值相匹配

# determine which centroid belongs to which cluster
# using Euclidean distance
dist1 = np.linalg.norm(centroids[0]-mean1)
dist2 = np.linalg.norm(centroids[1]-mean1)
if dist1 <= dist2:
    FIRST, SECOND = 0, 1
else:
    FIRST, SECOND = 1, 0

# compute accuracy by iterating through all 2N points
# note: first N points are from cloud1, second N points are from cloud2
correct = 0
for i in range(len(clusters)):
    if clusters[i] == FIRST and i < N:
        correct += 1    
    elif clusters[i] == SECOND and i >= N:
        correct += 1

# output accuracy
print 'Accuracy: %.2f' % (correct*100./len(clusters))

首先,您可以通过对应的图形GV,E识别问题:

点是顶点,当且仅当A靠近B时,点A和点B之间有一条边e,您可以自行定义闭合

由于每个点只属于一个组,因此组形成不相交的集合,可以使用简单的方法将点指定给组。在图论中,基本问题称为


DFS的复杂性是线性的,即OV+e。

首先,您可以使用相应的图GV,e来识别问题:

点是顶点,当且仅当A靠近B时,点A和点B之间有一条边e,您可以自行定义闭合

由于每个点只属于一个组,因此组形成不相交的集合,可以使用简单的方法将点指定给组。在图论中,基本问题称为


DFS的复杂性是线性的,即OV+e。

您要做的就是在图像处理中查找连接的组件。您有一个二进制图像,其中列表中的所有x,y像素都是1,而不是0

可以使用numpy/scipy将数据转换为二维二进制图像,然后调用ndimage.label查找连接的组件

假设所有x和y都>=0,您知道max_x和max_y,并且生成的图像适合内存,然后类似于:

import numpy as np
from scipy import ndimage

image = np.zeros(max_x, max_y)
for x, y in huge_list_of_xy_points:
    image[x, y] = 1

labelled = ndimage.label(image)

应该给出一个数组,其中组1中的所有像素都有值1,组2中的所有像素都有值2,等等。未测试。

您要做的是在图像处理中查找连接的组件。您有一个二进制图像,其中列表中的所有x,y像素都是1,而不是0

可以使用numpy/scipy将数据转换为二维二进制图像,然后调用ndimage.label查找连接的组件

假设所有x和y都>=0,您知道max_x和max_y,并且生成的图像适合内存,然后类似于:

import numpy as np
from scipy import ndimage

image = np.zeros(max_x, max_y)
for x, y in huge_list_of_xy_points:
    image[x, y] = 1

labelled = ndimage.label(image)

应该给出一个数组,其中组1中的所有像素都有值1,组2中的所有像素都有值2,等等。未测试。

您的输入数据有多大?可能超过1200万点如果您搜索群集,您会发现几十种技术。您的输入数据有多大?可能超过1200万点如果您搜索群集,您会发现几十种技术。我不知道会有多少有界群集。我还能用这个方法吗?是的,你只需要测试k的不同值。这是一个统计方法,有时会有错误-如果某组像素由于一个丢失的像素而与另一组断开连接,我不认为它总是正确的。相反,sc
ipy.ndimage.label完全按照他的要求执行。@RemcoGerlich:这是一种统计方法,不能保证所有数据集的性能。但是如果一个像素离一个组只有一个像素的距离,那么它就错了,这是不正确的。只要这个像素离一组比另一组更近,它就会被正确分配,假设方法收敛。我的意思是——我们不知道他的数据,也不知道他的实际问题,但他说他正在寻找一种基于连通性的分组方法。所以我认为我们认为这两组是很好的分离是很遗憾的,那么其他组的洞里的组呢?因为问题没有提到这一点。但我不知道我为什么要争论这个,祝你有个愉快的一天:-我永远不知道会有多少有界簇。我还能用这个方法吗?是的,你只需要测试k的不同值。这是一个统计方法,有时会有错误-如果某组像素由于一个丢失的像素而与另一组断开连接,我不认为它总是正确的。相反,scipy.ndimage.label完全按照他的要求执行。@RemcoGerlich:这是一种统计方法,不能保证所有数据集的性能。但是如果一个像素离一个组只有一个像素的距离,那么它就错了,这是不正确的。只要这个像素离一组比另一组更近,它就会被正确分配,假设方法收敛。我的意思是——我们不知道他的数据,也不知道他的实际问题,但他说他正在寻找一种基于连通性的分组方法。所以我认为我们认为这两组是很好的分离是很遗憾的,那么其他组的洞里的组呢?因为问题没有提到这一点。但我不知道我为什么要争论这个,祝你有愉快的一天:-