顶点的四面体边长(numpy)

时间:2014-12-16 01:27:22

标签: python numpy geometry

我试图使用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来生成所有顶点坐标对?

1 个答案:

答案 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])