假设我知道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)))
答案 0 :(得分: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]
以此类推。