获取创建ConvexHull的点的索引

Am1*_*3zA 1 python numpy scipy convex-hull

我正在使用scipy.spatial(来自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--')    
Run Code Online (Sandbox Code Playgroud)

问题是我没有正确理解什么是hull.simplices,我想找到在convexhull方面的点的索引,所以我可以使用这些索引从x和y得到点

War*_*ser 10

在2-D情况下,对象的simplices属性ConvexHull保持构成凸包的线段的点的索引对.获得索引的一种方法是获取展平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()
Run Code Online (Sandbox Code Playgroud)

这会产生:

点和凸包的情节

vertices属性在scipy 0.13.0中添加:

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()
Run Code Online (Sandbox Code Playgroud)

凸壳的例子