numpy 如何删除(参数化定义的)椭圆内的所有点/坐标

a14dhokn  于 2023-02-08  发布在  其他
关注(0)|答案(1)|浏览(111)

我有一些数据,看起来像这样:

我已经使用from skimage.measure import EllipseModel围绕一些数据绘制了一个椭圆,我能够通过向包提供B0_M数据和5200到5350之间的相应q^2来拟合椭圆,然后我能够从拟合中提取一些参数,自己绘制椭圆,如下所示:

X1Y1 = np.column_stack((X1,Y1))
ell = EllipseModel()
ell.estimate(X1Y1)
xc, yc, a, b, theta = ell.params

其中X1是完整的B_0数据,X2是完整的q^2数据集。它返回了以下椭圆参数值:

a = 0.399894
b = 37.826
xc = 5272
yc = 9.27
theta = 1.573

不幸的是,这个拟合并不完美,所以我缩放了一些参数,或者添加了一些小数字等,本质上是为了得到图中所示的拟合。

xc, yc, a, b, theta = ell.params
t = np.linspace(0, 2*np.pi, 100)
dt = 0.01*theta
ell_x = xc + 2*a*np.cos(theta+dt)*np.cos(t) - 1.8*b*np.sin(theta+dt)*np.sin(t)
ell_y = yc + 0.47*a*np.sin(theta+dt)*np.cos(t) + 0.47*b*np.cos(theta+dt)*np.sin(t)+0.26
plt.scatter(X,Y, marker = '.', alpha = 0.05, color = 'navy', s =0.2)
plt.scatter(xc, yc+0.26, color='red', s=10)
plt.plot(ell_x, ell_y, color = 'red')
plt.xlim(5150,5400)
plt.ylim(7,12)
plt.xlabel('B0_M')
plt.ylabel('$q^2$')
plt.title('jpsi')

现在,我要移除椭圆内X1Y1中的所有点
我该怎么做呢,我想用一个简单的数学论证,比如椭圆方程,但它更复杂,因为我有参数形式,而且它也不是最整洁的东西,因为我之前说过,用不同的量来缩放不同的变量。
有没有什么方法可以简单地说,“删除X,Y中的点,如果它们位于坐标为ell_x和ell_y的椭圆内”?
多谢

13z8s7eq

13z8s7eq1#

我认为你可以使用椭圆方程来构造一个屏蔽来隔离模型之外的点,技巧是在应用椭圆方程之前,使用xcycthetaX1Y1转换到椭圆的坐标系中。

dx = X1 - xc
dy = Y1 - yc

x2 = dx * np.cos(theta) + dy * np.sin(theta)
y2 = -dx * np.sin(theta) + dy * np.cos(theta)

mask = np.square(x2 / a) + np.square(y2 / b) > 1

X1_outside = X1[mask]
Y1_outside = Y1[mask]

注意:我希望skimage.measure.Ellipse有一些方法可以使这变得更容易,但是我在快速阅读文档后找不到它。如果有人知道如何使用Ellipse来做这件事,那将更具可读性。

相关问题