我试图使用NumPy从顶点计算四面体的边长,但我能想到的最好的是有点纠结:
import numpy as np
V = np.array([[ 1, 1, 1], [-1, -1, 1], [ 1, -1, -1], [-1, 1, -1]])
vertex_pair_indexes = np.array([[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]])
np.squeeze(np.linalg.norm((diff(V[vertex_pair_indexes], axis=1)), axis=2))
我可以更自然地重构这一点并避免np.squeeze()
来电吗?有没有办法,没有使用itertools.combinations
来生成所有顶点坐标对?
答案 0 :(得分:2)
这是一种简化计算的方法:
In [42]: vertex_pair_indexes
Out[42]:
array([[0, 1],
[0, 2],
[0, 3],
[1, 2],
[1, 3],
[2, 3]])
In [43]: first = vertex_pair_indexes[:, 0]
In [44]: second = vertex_pair_indexes[:, 1]
In [45]: np.linalg.norm(V[first] - V[second], axis=-1)
Out[45]:
array([ 2.82842712, 2.82842712, 2.82842712, 2.82842712, 2.82842712,
2.82842712])
您可以按照建议使用itertools.combinations
生成vertex_pair_indexes
,但如果您只对四面体感兴趣,也可以使用first = np.array([0, 0, 0, 1, 1, 2])
和所需的顶点硬连线。 second = np.array([1, 2, 3, 2, 3, 3])
。
或者,如果你不介意对scipy的依赖,你可以使用scipy.spatial.distance.pdist
:
In [70]: from scipy.spatial.distance import pdist
In [71]: pdist(V)
Out[71]:
array([ 2.82842712, 2.82842712, 2.82842712, 2.82842712, 2.82842712,
2.82842712])