Numpy 如何计算每个多边形具有不同坐标的大量多边形的面积

Numpy 如何计算每个多边形具有不同坐标的大量多边形的面积,numpy,polygon,area,point-in-polygon,Numpy,Polygon,Area,Point In Polygon,假设我知道700个不同的x坐标值以及另外700个不同的y坐标值。从我的坐标中每7个点可以构造一个多边形。我可以很容易地选择任何公式在这里我用鞋带公式来计算任何多边形的面积。但是用这种方法计算每个多边形的面积真的很困难,有没有好的方法可以计算所有多边形的面积,在这种情况下,多边形的总数一次是100个,例如通过使用任何迭代 下面显示了一个简单的代码: import numpy as np x = np.arange(0.5, 700) #create random coordinates y =

假设我知道700个不同的x坐标值以及另外700个不同的y坐标值。从我的坐标中每7个点可以构造一个多边形。我可以很容易地选择任何公式在这里我用鞋带公式来计算任何多边形的面积。但是用这种方法计算每个多边形的面积真的很困难,有没有好的方法可以计算所有多边形的面积,在这种情况下,多边形的总数一次是100个,例如通过使用任何迭代

下面显示了一个简单的代码:

import numpy as np

x = np.arange(0.5, 700)  #create random coordinates
y = np.arange(0.3, 700)  #create random coordinates

#first 7 coordinates that could form a polygon
x_1 = x[0:7]  
y_1 = y[0:7]

#Area of the first polygon
Area = 0.5 * np.array(np.dot(x_1, np.roll(x_1, 1)) - np.dot(y_1, np.roll(y_1, 1)))

这里有一个矢量化的方法来获取所有多边形区域-

X = x.reshape(-1,7)
Y = y.reshape(-1,7)

Xr = np.roll(X,1,axis=1)
Yr = np.roll(Y,1,axis=1)
p1 = np.einsum('ij,ij->i',X,Xr)
p2 = np.einsum('ij,ij->i',Y,Yr)
Area_out = (p1-p2)/2
或者,使用np.matmul获得总和修正-

p1 = np.matmul(X[:,None,:],Xr[:,:,None])[:,0,0]
在Python3.x上使用等效的@operator-

p1 = (X[:,None,:]@Xr[:,:,None])[:,0,0]
类似地,将其用于p2

避免切片滚动

我们可以利用切片跳过轧制,从而获得更高的性能。像这样-

p1 = np.einsum('ij,ij->i',X[:,:-1],X[:,1:]) + X[:,0]*X[:,-1]
p2 = np.einsum('ij,ij->i',Y[:,:-1],Y[:,1:]) + Y[:,0]*Y[:,-1]
如前所述,我们可以在同一行上引入np.matmul/@操作符,即-

p1 = np.matmul(X[:,None,:-1],X[:,1:,None])[:,0,0] + X[:,0]*X[:,-1]

等等。

非常感谢@Divakar,它真的帮了我很多忙。顺便说一下,我发现“滚动”和“不滚动”的结果相同。如果我在这里使用“滚动”会产生任何问题吗?@Photon不滚动一个只是一种选择,但速度更快。