获取创建 ConvexHull 的点的索引
Posted
技术标签:
【中文标题】获取创建 ConvexHull 的点的索引【英文标题】:get the index of point which create ConvexHull 【发布时间】:2013-08-12 17:41:42 【问题描述】:我正在尝试使用 scipy.spatial (from scipy.spatial import ConvexHull) 来绘制一系列点的凸包。
import pylab as pl
from scipy.spatial import ConvexHull
pl.figure()
pl.hold(True)
points = np.concatenate((x, y), axis=1)
hull = ConvexHull(points)
pl.plot(points[:,0], points[:,1], 'ro')
for simplex in hull.simplices:
pl.plot(points[simplex,0], points[simplex,1], 'dk--')
问题是我没有正确理解什么是 hull.simplices,我想找到凸包面上点的索引,以便我可以使用这些索引从 x 和 y 中获取点
【问题讨论】:
【参考方案1】:在二维情况下,ConvexHull
对象的simplices
属性包含构成凸包线段的点的索引对。仅获取索引的一种方法是获取扁平 simplices
数组的唯一元素。但请注意,这些点不会按照集合周围的凸包的顺序排列。 (在 scipy 0.13.0 及更高版本中,您可以使用 vertices
属性获取索引;见下文。)
例如,
import numpy as np
from scipy.spatial import ConvexHull
import matplotlib.pyplot as plt
# Generate some random points for the demo.
np.random.seed(4321)
pts = 0.1 + 0.8*np.random.rand(15, 2)
ch = ConvexHull(pts)
# hull_indices = ch.vertices # This will work in the scipy 0.13
hull_indices = np.unique(ch.simplices.flat)
hull_pts = pts[hull_indices, :]
plt.plot(pts[:, 0], pts[:, 1], 'ko', markersize=10)
plt.plot(hull_pts[:, 0], hull_pts[:, 1], 'ro', alpha=.25, markersize=20)
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.show()
这会生成:
在 scipy 0.13.0 中添加了vertices
属性:
import numpy as np
from scipy.spatial import ConvexHull
import matplotlib.pyplot as plt
# Generate some random points for the demo.
np.random.seed(4321)
pts = 0.1 + 0.8*np.random.rand(15, 2)
ch = ConvexHull(pts)
# Get the indices of the hull points.
hull_indices = ch.vertices
# These are the actual points.
hull_pts = pts[hull_indices, :]
plt.plot(pts[:, 0], pts[:, 1], 'ko', markersize=10)
plt.fill(hull_pts[:,0], hull_pts[:,1], fill=False, edgecolor='b')
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.show()
【讨论】:
我之前看到过顶点,但我的问题是,当我使用顶点时,我得到了这个错误“AttributeError: 'ConvexHull' object has no attribute 'vertices'” 啊,对不起。我正在使用来自 github 的最新版本的 scipy。vertices
属性是几个月前添加的 (github.com/scipy/scipy/commit/…)。
感谢您的解决方案,但如果您想根据索引绘制凸包(pl.plot(points[hull_indices,0], points[hull_indices,1], 'b--')) 形状不正确,我认为那是因为您的解决方案没有保存索引的顺序
这就是我所说的“点不会按照集合周围的凸包的顺序排列”的意思(这就是为什么我使用特殊标记而不是绘制线段的原因)。 ConvexHull 的文档字符串显示了绘制形状的示例:docs.scipy.org/doc/scipy/reference/generated/…以上是关于获取创建 ConvexHull 的点的索引的主要内容,如果未能解决你的问题,请参考以下文章
如何使用sklearn找到最接近K的点的索引意味着聚类中心?
Scipy ConvexHull 和 QHull:等级/维度不是最大的