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

How to calculate area of lots of polygon where each polygon has different coordinates

假设我知道 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]

相当于 @ operator(在 Python3.x 上)-

p1 = (X[:,None,:]@Xr[:,:,None])[:,0,0]

同样,用于p2


避免切片滚动

我们可以利用slicing跳过滚动,从而获得更高的性能。像这样提升 -

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/@ operator 放在同一行,即 -

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

等等。