[英]How to vectorize operations over several rows in a matrix with numpy
我正在使用 Trimesh,并尝试计算网格的一些统计数据。 可能的统计数据之一(也是我用来说明问题的统计数据)是网格的 3 个随机顶点的区域的直方图。 目前我正在执行以下操作,但我想知道是否有任何方法可以避免使用循环。
def CalcArea(self, p):
return 0.5 * np.linalg.norm(np.cross(p[1]-p[0], p[2]-p[0]))
v_c = self.mesh.vertices.copy()
np.random.shuffle(v_c)
areas = [self.CalcArea(v_c[i:i+3]) for i in range(len(v_c[:-2]))]
np.cross
和np.linalg.norm
适用于向量的 arrays。 他们支持强大的关键字参数axis
。
我假设您的v_c
具有形状(N, 3)
,其中N
是您的顶点数。 为简单起见,我们假设它是三的倍数,然后:
N = 30
v_c = np.random.random((N, 3))
v1 = v_c[N//3:2*N//3, :] - v_c[:N//3, :]
v2 = v_c[2*N//3:, :] - v_c[:N//3, :]
area = 0.5*np.linalg.norm(np.cross(v1, v2), axis=1)
请注意,这涉及临时 arrays 的创建,因此请注意非常大的N
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.