我有一个numpy
带有多边形的数组,我需要为这些多边形获取一个带有法线的数组,我找到了一种在循环中执行它的方法,但是为了速度,我想在没有循环的情况下执行它,但是我停留在法线标准化的那一刻。循环选项:
def get_normal(translated_vec):
print(translated_vec)
line1 = translated_vec[1] - translated_vec[0]
line2 = translated_vec[2] - translated_vec[0]
normal = np.array([line1[1] * line2[2] - line1[2] * line2[1],
line1[2] * line2[0] - line1[0] * line2[2],
line1[0] * line2[1] - line1[1] * line2[0]])
l = sqrt(sum(np.power(normal, 2)))
if l != 0:
normal /= l
else:
normal += 1.73205080757
return normal
translated_vec = np.array([[[ 0.07243389, -0.462265, 4.87585974],
[ 0.13487457, -0.3653465, 5.06419032],
[ 0.20468741, -0.1275775, 4.95642205]],
[[-0.0753569, -0.142866, 4.75400399],
[ 0.12289676, -0.1275775, 4.83061181],
[ 0.02365434, 0.2133755, 4.71171791]]])
while True:
for i, translated_vec in enumerate(translated_vecs):
normal = get_normal(translated_vec)
不带循环的选项:
def get_normals(translated_vec):
line1 = translated_vec[:, 1] - translated_vec[:, 0]
line2 = translated_vec[:, 2] - translated_vec[:, 0]
normal = np.cross(line1, line2)
# Здесь фрагмент на котором я застрял
sqrts = np.array([np.linalg.norm(n) for n in normal])
# l = np.linalg.norm(normal)
normal /= sqrts[:,np.newaxis]
# if l != 0:
# normal /= l
# else:
# normal += 1.73205080757
return normal
translated_vec = np.array([[[ 0.07243389, -0.462265, 4.87585974],
[ 0.13487457, -0.3653465, 5.06419032],
[ 0.20468741, -0.1275775, 4.95642205]],
[[-0.0753569, -0.142866, 4.75400399],
[ 0.12289676, -0.1275775, 4.83061181],
[ 0.02365434, 0.2133755, 4.71171791]]])
while True:
normal = get_normals(translated_vec)
输出应该是这样的:
[-0.93211486 0.33550072 0.13638602] # Нормаль первого полигона
[-0.36645627 0.20945855 0.90655222] # Нормаль второго полигона
主要问题是我不知道如何快速创建一个具有正常长度的数组,这样我就可以同时将具有法线的数组除以它们的长度,从而快速且没有循环。
我意识到我(或左右)出了什么问题,所需要的就是加快这个建设:
我是这样做的:
我了解了有关该功能的更多信息
numpy.sum
,并了解了如何在没有错误和预期结果的情况下加速该功能。您可以稍微优化您的解决方案:
考试: