我有一个二维numpy数组,我想计算一下下面的等式。有没有一种类似numpy (矢量化)的方法来实现这种评估,而不只是迭代这些值?
额外的问题,有没有一种方法(再次矢量化)将乘积的每个结果保存在一个新的一维numpy数组中?提前感谢
顺便说一句,这个公式是从这个网站找到的:https://www.seas.upenn.edu/~ese502/lab-content/extra_materials/Polygon%20Area%20and%20Centroid.pdf

发布于 2021-05-12 16:09:26
您可以按如下方式使用numpy.roll:
import numpy as np
N = 5
a = np.random.rand(N, 2)
x, y = a[:,0], a[:,1]
area = 1/2 * np.sum(x*np.roll(y, 1) - y*np.roll(x, 1))发布于 2021-05-12 16:06:13
下面是SQF语言的一个实现:
private _n0 = count(_polygon);
private _surface = 0;
for "_i0" from 0 to (_n0 - 1) do {
private _p1 = _polygon select _i0;
private _p2 = _polygon select ((_i0 + 1) % _n0);
private _p1x = _p1 select 0;
private _p1y = _p1 select 1;
private _p2x = _p2 select 0;
private _p2y = _p2 select 1;
_surface = _surface + ((_p1x * _p2y) - (_p2x * _p1y)) / 2;你只需要把它翻译成python即可。
发布于 2021-05-14 09:32:57
einsum可以方便地实现鞋带公式
A # --- sample array representing a polygon ordered clockwise
array([[ 0.00, 0.00],
[ 0.00, 10.00],
[ 10.00, 10.00],
[ 10.00, 0.00],
[ 0.00, 0.00]])
# --- can be implemented in a list comprehension of for loop
def _bit_area_(a):
"""Mini e_area, used by `areas` and `centroids`."""
x0, y1 = (a.T)[:, 1:]
x1, y0 = (a.T)[:, :-1]
e0 = np.einsum('...i,...i->...i', x0, y0)
e1 = np.einsum('...i,...i->...i', x1, y1)
return np.sum((e0 - e1) * 0.5)
_bit_area_(A)
100.0 # --- result for a 10 x 10 unit square,https://stackoverflow.com/questions/67499435
复制相似问题