尊敬的stackoverflow用户,
我面临如下问题:我想在我的python脚本中将3D椭球体适合3D数据点。
起始数据是一组x,y和z坐标(笛卡尔坐标)。我想得到的是3D数据点的凸包的最佳拟合椭球的定义方程中的a和c。
等式在正确旋转和平移的坐标系中:
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLmltZ3VyLmNvbS82SDdYcFU2LmdpZiJ9” alt =“椭圆方程”>
所以我理想地要做的任务是:
查找3D数据点的凸包
将最佳椭圆形拟合到凸包,并得到a和c
您知道是否有一些库允许使用最少的代码行在Python中执行此操作?还是我必须用有限的数学知识(在寻找最合适的椭球体时实际上为零)显式地编码所有这些步骤?
感谢您的帮助,祝您愉快!
好吧,我将scipy的凸包算法与this website上的某些python函数结合起来找到了解决方案。>
让我们假设您得到一个x坐标的numpy向量,一个y坐标的numpy向量以及一个z坐标的numpy向量,分别名为x,y和z。这对我有用:
from scipy.spatial import ConvexHull, convex_hull_plot_2d
import numpy as np
from numpy.linalg import eig, inv
#let us assume some definition of x, y and z
#get convex hull of molecular surface
surface = np.stack((conf.x,conf.y,conf.z), axis=-1)
hullV = ConvexHull(surface)
lH = len(hullV.vertices)
hull = np.zeros((lH,3))
for i in range(len(hullV.vertices)):
hull[i] = surface[hullV.vertices[i]]
hull = np.transpose(hull)
#fit ellipsoid on convex hull
eansa = ls_ellipsoid(hull[0],hull[1],hull[2]) #get ellipsoid polynomial coefficients
print("coefficients:" , eansa)
center,axes,inve = polyToParams3D(eansa,False) #get ellipsoid 3D parameters
print("center:" , center)
print("axes:" , axes)
print("rotationMatrix:", inve)