首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个numpy构造工作,并且有一个更正确的方法来做它?

为什么这个numpy构造工作,并且有一个更正确的方法来做它?
EN

Stack Overflow用户
提问于 2021-03-06 09:14:58
回答 1查看 37关注 0票数 1

我使用numpy从由顶点索引定义的四面图中提取人脸。我有一个初始数组定义了四面体图解

代码语言:javascript
复制
tetrahedra = np.array([[0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5]])

对于每个四面体,我使用掩模阵列来识别人脸。

代码语言:javascript
复制
face1 = [True, True, True, False]
face2 = [True, True, False, True]
face3 = [False, True, True, True]
face4 = [True, False, True, True]

我发现下面的numpy表达式对于每个四面体都会产生面缺陷

代码语言:javascript
复制
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。

代码语言:javascript
复制
mask1_ = np.array([0, 1, 2])
mask2_ = np.array([0, 1, 3])
mask3_ = np.array([1, 2, 3])
mask4_ = np.array([0, 2, 3])

,然后将表达式更新为

代码语言:javascript
复制
faces = tetrahedra[:,np.reshape(np.r_[face1_, face2_, face3_, face4_], (-1,3))]

现在我的问题是,这实际上是如何工作的,是否有一种更好/更快的方法来执行这个操作?输出如下所示

THanks在此提供任何帮助。我很想接受它,因为它看起来很有效,但我无法解释为什么它能起作用,这让我担心……

代码语言:javascript
复制
[[[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]]

]

编辑清理版是,

代码语言:javascript
复制
face_masks = np.array([[0, 1, 2], [0, 1, 3], [1, 2, 3],[0, 2, 3]])
faces = tetrahedra[:,face_masks]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-06 17:09:19

所有中间步骤:

代码语言:javascript
复制
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种选择串联到一个数组中:

代码语言:javascript
复制
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也可以用来连接选择,但这是一个小变化:

代码语言:javascript
复制
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元素的索引:

代码语言:javascript
复制
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_相同的索引。

代码语言:javascript
复制
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]]])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66504106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档