scipy.spatial 中的凸壳例程给了我原来的一组点

Posted

技术标签:

【中文标题】scipy.spatial 中的凸壳例程给了我原来的一组点【英文标题】:Convex hull routines in scipy.spatial gives me back my original set of points 【发布时间】:2013-10-23 21:10:44 【问题描述】:

我有一组点,想找到凸包。当我将它们提供给 scipy.spatial(ConvexHull 或 Delaunay)时,我只会得到原始点集。通过构造,情况不应如此。

这里是 the points 作为腌制的 numpy 数组。我的代码如下:

import pickle
from scipy import spatial
import matplotlib.pyplot as plt

points = pickle.load( open( "points.p", "rb" ) )

hullpoints = spatial.ConvexHull(points).points


# plot points
fig = plt.figure()
ax = fig.gca(projection='3d')
# ax.plot(points[:, 0], points[:, 1], points[:, 2], 'r.') # original points
ax.plot(hullpoints[:, 0], hullpoints[:, 1], hullpoints[:, 2], 'r.') # convex hull of points


# set labels and show()
ax.set_xlabel('Player 1')
ax.set_ylabel('Player 2')
ax.set_zlabel('Player 3')
plt.show()

显然,其中一些点位于凸包内部,应通过 spatial.ConvexHull(points) 或 spatial.Delaunay(points) 移除,如在给定 here 的 2d 示例中所做的那样。

有人知道我为什么要拿回原来的积分吗?我可以蛮力找到外部点并仅绘制那些(最终目标是由点近似的外部形状的表面图),但似乎 scipy.spatial 应该能够做到这一点。

【问题讨论】:

【参考方案1】:

您正在使用.points 属性,它可以返回输入点。尝试改用.simplices 属性,它会为您提供“形成凸包简单面的点”。

See the documentation for more info.

【讨论】:

他可能想调用hull.points[np.unique(hull.simplices)] 来获取凸包中唯一点的实际列表。 就是这样!非常感谢。 如果您正在寻找点来创建多边形几何图形,那么hull.points[hull.vertices] 将为您提供所需序列中的点。

以上是关于scipy.spatial 中的凸壳例程给了我原来的一组点的主要内容,如果未能解决你的问题,请参考以下文章

官方例程给了四个文件两个tcl文件,一个xdc文件,一个v文件,能在vivado下还原出整个工程吗?怎么做呢?

python库skimage 绘制二值图像的凸壳(convex hull)

cx_Freeze:主脚本中的 Python 错误 - ModuleNotFoundError:没有名为 'scipy.spatial.ckdtree 的模块

youcans 的 OpenCV 例程200篇126. 形态算法之凸壳(Convex hull)

使用 pyinstaller 编译 python 脚本后没有名为 'scipy.spatial.transform._rotation_groups 的模块

ModuleNotFoundError: No module named ‘scipy.spatial.transform._rotation_groups‘