如何在Python中计算两个轮廓之间的点数

如何在Python中计算两个轮廓之间的点数,python,matplotlib,contour,Python,Matplotlib,Contour,我正在使用matplotlib.pyplot插值数据并创建等高线。 下面的答案/示例(关于如何计算轮廓内的面积),我能够获得轮廓线的顶点。 有没有一种方法可以使用这些信息(即直线的顶点)来计算两个给定轮廓之间有多少个点?这些点将不同于用于导出等高线的数据。我不确定我是否了解您要检查哪些点,但是,如果您有线顶点(两点),并且希望检查第三个点是否位于两者之间,您可以采取简单(无效)的方法接近并计算由三个三角形组成的三角形的面积。如果面积为0,则该点落在同一条线上。此外,还可以计算点之间的距离,并查看

我正在使用
matplotlib.pyplot
插值数据并创建等高线。 下面的答案/示例(关于如何计算轮廓内的面积),我能够获得轮廓线的顶点。
有没有一种方法可以使用这些信息(即直线的顶点)来计算两个给定轮廓之间有多少个点?这些点将不同于用于导出等高线的数据。

我不确定我是否了解您要检查哪些点,但是,如果您有线顶点(两点),并且希望检查第三个点是否位于两者之间,您可以采取简单(无效)的方法接近并计算由三个三角形组成的三角形的面积。如果面积为0,则该点落在同一条线上。此外,还可以计算点之间的距离,并查看点是在直线上的点之间还是在延伸直线上的点之间


希望这有帮助

我不确定我是否了解您要检查哪些点,但是,如果您有直线顶点(两个点),并且希望检查第三个点是否位于这两个点之间,则可以采用简单(非有效)的方法,并计算由这三个点形成的三角形的面积。如果面积为0,则该点落在同一条线上。此外,还可以计算点之间的距离,并查看点是在直线上的点之间还是在延伸直线上的点之间


希望这有帮助

通常情况下,您不希望通过对绘图进行反向工程来获取某些数据。相反,您可以对稍后用于绘制等高线的阵列进行插值,并找出哪些点位于具有特定值的区域中

下面将找到
-0.8
-0.4
级别之间的所有点,打印它们并在绘图上以红色显示

import numpy as np; np.random.seed(1)
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
from scipy.interpolate import Rbf

X, Y = np.meshgrid(np.arange(-3.0, 3.0, 0.1), np.arange(-2.4, 1.0, 0.1))
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
Z = 10.0 * (Z2 - Z1)

points = np.random.randn(15,2)/1.2
levels = [-1.2, -0.8,-0.4,-0.2]

# interpolate points
f = Rbf(X.flatten(), Y.flatten(), Z.flatten()) 
zi = f(points[:,0], points[:,1])
# add interpolated points to array with columns x,y,z
points3d = np.zeros((points.shape[0],3))
points3d[:,:2] = points
points3d[:,2] = zi
# masking condition for points between levels
filt = (zi>levels[1]) & (zi <levels[2])
# print points between the second and third level
print(points3d[filt,:])

### plotting
fig, ax = plt.subplots()

CS = ax.contour(X, Y, Z, levels=levels)
ax.clabel(CS, inline=1, fontsize=10)
#plot points between the second and third level in red:
ax.scatter(points[:,0], points[:,1], c=filt.astype(float), cmap="bwr" )

plt.show()
将numpy作为np导入;np.随机种子(1)
将matplotlib.mlab导入为mlab
将matplotlib.pyplot作为plt导入
从scipy.interpolate导入Rbf
十、 Y=np.meshgrid(np.arange(-3.0,3.0,0.1),np.arange(-2.4,1.0,0.1))
Z1=mlab.二元_正态(X,Y,1.0,1.0,0.0,0.0)
Z2=mlab.二元正态(X,Y,1.5,0.5,1,1)
Z=10.0*(Z2-Z1)
点数=np.随机数randn(15,2)/1.2
级别=[-1.2,-0.8,-0.4,-0.2]
#插值点
f=Rbf(X.展平(),Y.展平(),Z.展平())
zi=f(点[:,0],点[:,1])
#将插值点添加到具有x、y、z列的阵列
点3d=np.zero((点形状[0],3))
点3d[:,:2]=点
点3d[:,2]=zi
#层间点的掩蔽条件

filt=(zi>levels[1])&(zi通常,您不希望对绘图进行反向工程以获得某些数据。相反,您可以对稍后用于绘制等高线的数组进行插值,并找出哪些点位于具有特定值的区域中

下面将找到
-0.8
-0.4
级别之间的所有点,打印它们并在绘图上以红色显示

import numpy as np; np.random.seed(1)
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
from scipy.interpolate import Rbf

X, Y = np.meshgrid(np.arange(-3.0, 3.0, 0.1), np.arange(-2.4, 1.0, 0.1))
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
Z = 10.0 * (Z2 - Z1)

points = np.random.randn(15,2)/1.2
levels = [-1.2, -0.8,-0.4,-0.2]

# interpolate points
f = Rbf(X.flatten(), Y.flatten(), Z.flatten()) 
zi = f(points[:,0], points[:,1])
# add interpolated points to array with columns x,y,z
points3d = np.zeros((points.shape[0],3))
points3d[:,:2] = points
points3d[:,2] = zi
# masking condition for points between levels
filt = (zi>levels[1]) & (zi <levels[2])
# print points between the second and third level
print(points3d[filt,:])

### plotting
fig, ax = plt.subplots()

CS = ax.contour(X, Y, Z, levels=levels)
ax.clabel(CS, inline=1, fontsize=10)
#plot points between the second and third level in red:
ax.scatter(points[:,0], points[:,1], c=filt.astype(float), cmap="bwr" )

plt.show()
将numpy作为np导入;np.random.seed(1)
将matplotlib.mlab导入为mlab
将matplotlib.pyplot作为plt导入
从scipy.interpolate导入Rbf
十、 Y=np.meshgrid(np.arange(-3.0,3.0,0.1),np.arange(-2.4,1.0,0.1))
Z1=mlab.二元_正态(X,Y,1.0,1.0,0.0,0.0)
Z2=mlab.二元正态(X,Y,1.5,0.5,1,1)
Z=10.0*(Z2-Z1)
点数=np.随机数randn(15,2)/1.2
级别=[-1.2,-0.8,-0.4,-0.2]
#插值点
f=Rbf(X.展平(),Y.展平(),Z.展平())
zi=f(点[:,0],点[:,1])
#将插值点添加到具有x、y、z列的阵列
点3d=np.zero((点形状[0],3))
点3d[:,:2]=点
点3d[:,2]=zi
#层间点的掩蔽条件

filt=(zi>levels[1])&(zi是的,我说的是检查“第三个点”是否介于两者之间,只是我有一组大约20-40K的点需要检查/计数。你的评论确实帮助我进一步思考,但我很难概念化如何对一条线(而不仅仅是一组x,y顶点)执行此操作还有很多要点。谢谢!是的,我说的是检查“第三个点”是否介于两者之间,除了我有一组大约20-40K的点需要检查/计数。你的评论确实帮助我进一步思考,但我很难概念化如何对一条线(而不仅仅是一组x,y顶点)执行此操作还有很多要点。谢谢!谢谢你的回答。我认为这将帮助我更好地阐明我的目标:我不需要对绘图进行反向工程。相反,我想使用从已知X、Y、Z的数组/数据集获得的2条等高线,并希望将其用于仅已知X和Y的其他数组。因为我的Z值来自时间-I我只想知道它们落在轮廓的哪一边(而不是它们的确切位置),我希望我可以避免为新阵列再次运行模型,而是使用现有轮廓的顶点。这有更好的意义吗?当然,但上面的操作不正是这样吗?看起来您需要知道示例中Z的值,才能使用遮罩并将其过滤掉。我只有一个阵列有Z,但没有for其余的。如果我遗漏了一些明显的东西,请原谅?从本质上看,我的任务类似于通过“光线投射”完成的“多边形中的点”问题。除了多边形之外,我有两个轮廓。我可以将我的轮廓转换为多边形,但我想知道是否有一种更直接的方法你需要
X
Y
Z
(我想这些是密集型模型中的数据)。你需要知道两个轮廓级别(例如
Z=-0.8,Z=-0.4
),最后你需要一些
点,你想知道它们是否位于轮廓内(你只有X,Y个点,Z=zi在脚本中计算).谢谢你的回答。我想这会帮助我更好地表达我的目标:我不需要对情节进行反向工程。相反,我希望