我使用numpy从由顶点索引定义的四面图中提取人脸。我有一个初始数组定义了四面体图解
tetrahedra = np.array([[0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5]])对于每个四面体,我使用掩模阵列来识别人脸。
face1 = [True, True, True, False]
face2 = [True, True, False, True]
face3 = [False, True, True, True]
face4 = [True, False, True, True]我发现下面的numpy表达式对于每个四面体都会产生面缺陷
faces = tetrahedra[:,np.reshape(np.r_[tetrahedra[0][face1 ],tetrahedra[0][face2 ],tetrahedra[0][face3 ],tetrahedra[0][face4 ]], (-1,3))]编辑:由于@npaulj,我现在看到这似乎只起作用,因为索引表示法中的四面体实际上是0、1、2、3。
mask1_ = np.array([0, 1, 2])
mask2_ = np.array([0, 1, 3])
mask3_ = np.array([1, 2, 3])
mask4_ = np.array([0, 2, 3]),然后将表达式更新为
faces = tetrahedra[:,np.reshape(np.r_[face1_, face2_, face3_, face4_], (-1,3))]现在我的问题是,这实际上是如何工作的,是否有一种更好/更快的方法来执行这个操作?输出如下所示
THanks在此提供任何帮助。我很想接受它,因为它看起来很有效,但我无法解释为什么它能起作用,这让我担心……
[[[0 1 2]
[0 1 3]
[1 2 3]
[0 2 3]]
[[1 2 3]
[1 2 4]
[2 3 4]
[1 3 4]]
[[2 3 4]
[2 3 5]
[3 4 5]
[2 4 5]]]
编辑清理版是,
face_masks = np.array([[0, 1, 2], [0, 1, 3], [1, 2, 3],[0, 2, 3]])
faces = tetrahedra[:,face_masks]发布于 2021-03-06 17:09:19
所有中间步骤:
In [77]: tetrahedra = np.array([[0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5]])
...: face1 = [True, True, True, False]
...: face2 = [True, True, False, True]
...: face3 = [False, True, True, True]
...: face4 = [True, False, True, True]
In [78]: tetrahedra[0]
Out[78]: array([0, 1, 2, 3])
In [79]: tetrahedra[0][face1]
Out[79]: array([0, 1, 2])r_将这4种选择串联到一个数组中:
In [80]: np.r_[tetrahedra[0][face1 ],tetrahedra[0][face2 ],tetrahedra[0][face3 ],tetrahedra[0][face4 ]]
Out[80]: array([0, 1, 2, 0, 1, 3, 1, 2, 3, 0, 2, 3])
In [81]: np.reshape(np.r_[tetrahedra[0][face1 ],tetrahedra[0][face2 ],tetrahedra[0][face3
...: ],tetrahedra[0][face4 ]], (-1,3))
Out[81]:
array([[0, 1, 2],
[0, 1, 3],
[1, 2, 3],
[0, 2, 3]])最后,只需将其用于索引tetrahedra的列维度。索引a (3,4)与此(4,3)产生a (3,4,3)。
vstack也可以用来连接选择,但这是一个小变化:
In [82]: np.vstack([tetrahedra[0][face1 ],tetrahedra[0][face2 ],tetrahedra[0][face3 ],tet
...: rahedra[0][face4 ]])
Out[82]:
array([[0, 1, 2],
[0, 1, 3],
[1, 2, 3],
[0, 2, 3]])编辑
或者,如果不希望指望tetrahedra[0]为0、1、2、3,则只需查找True元素的索引:
In [106]: np.nonzero([face1,face2,face3,face4])
Out[106]:
(array([0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]),
array([0, 1, 2, 0, 1, 3, 1, 2, 3, 0, 2, 3]))元组[1]的第二个元素是与r_相同的索引。
In [122]: idx = np.nonzero([face1,face2,face3,face4])
In [123]: idx[1]
Out[123]: array([0, 1, 2, 0, 1, 3, 1, 2, 3, 0, 2, 3])
In [124]: tetrahedra[np.arange(3)[:,None],idx[1]]
Out[124]:
array([[0, 1, 2, 0, 1, 3, 1, 2, 3, 0, 2, 3],
[1, 2, 3, 1, 2, 4, 2, 3, 4, 1, 3, 4],
[2, 3, 4, 2, 3, 5, 3, 4, 5, 2, 4, 5]])
In [125]: tetrahedra[np.arange(3)[:,None],idx[1]].reshape(3,4,3)
Out[125]:
array([[[0, 1, 2],
[0, 1, 3],
[1, 2, 3],
[0, 2, 3]],
[[1, 2, 3],
[1, 2, 4],
[2, 3, 4],
[1, 3, 4]],
[[2, 3, 4],
[2, 3, 5],
[3, 4, 5],
[2, 4, 5]]])https://stackoverflow.com/questions/66504106
复制相似问题