【问题标题】:Filter 2d arrays containing a 1d array inside a 3d array在 3d 数组中过滤包含 1d 数组的 2d 数组
【发布时间】:2018-12-03 03:33:53
【问题描述】:

我有一个 3d 数组(三角形数组)。我想获得包含给定点(一维数组)的三角形(二维数组)。 我经历了 in1d, where, argwhere 但我仍然不成功....

例如:

import numpy as np
import numpy.random as rd

t = rd.random_sample((10,3,3))

v0 = np.array([1,2,3])

t[1,2] = v0
t[5,0] = v0 
t[8,1] = v0

我想得到:

array([[[[[ 0.87312   ,  0.33411403,  0.56808291],
          [ 0.36769417,  0.66884858,  0.99675896],
          [ 1.        ,  2.        ,  3.        ]],

         [[ 0.31995867,  0.58351034,  0.38731405],
          [ 1.        ,  2.        ,  3.        ],
          [ 0.04435288,  0.96613852,  0.83228402]],

         [[ 1.        ,  2.        ,  3.        ],
          [ 0.28647107,  0.95755263,  0.5378722 ],
          [ 0.73731078,  0.8777235 ,  0.75866665]]]])

然后得到v0个相邻点的集合

{[ 0.87312   ,  0.33411403,  0.56808291],
 [ 0.36769417,  0.66884858,  0.99675896],
 [ 0.31995867,  0.58351034,  0.38731405],
 [ 0.04435288,  0.96613852,  0.83228402],
 [ 0.28647107,  0.95755263,  0.5378722 ],
 [ 0.73731078,  0.8777235 ,  0.75866665]}

没有循环,数组很大。

例如

In [28]: np.in1d(v0,t[8]).all()
Out[28]: True

可以在一行上进行测试,但我无法通过 all 数组进行测试。 感谢您的帮助。

我的意思是矢量化等价于:

In[54]:[triangle for triangle in t if v0 in triangle ]
Out[54]: 
    [array([[ 0.87312   ,  0.33411403,  0.56808291],
            [ 0.36769417,  0.66884858,  0.99675896],
            [ 1.        ,  2.        ,  3.        ]]),
     array([[ 0.31995867,  0.58351034,  0.38731405],
            [ 1.        ,  2.        ,  3.        ],
            [ 0.04435288,  0.96613852,  0.83228402]]),
     array([[ 1.        ,  2.        ,  3.        ],
            [ 0.28647107,  0.95755263,  0.5378722 ],
            [ 0.73731078,  0.8777235 ,  0.75866665]])]

【问题讨论】:

  • 你能分享完整的工作循环代码吗?
  • 我的意思是我想要一个矢量化的等价于:In[5]:[triangle for triangle in t if v0 in triangle ]Out[5]: [array([[ 0.87312 , 0.33411403, 0.56808291], [ 0.36769417, 0.66884858, 0.99675896], [ 1. , 2. , 3. ]]), array([[ 0.31995867, 0.58351034, 0.38731405], [ 1. , 2. , 3. ], [ 0.04435288, 0.96613852, 0.83228402]]), array([[ 1. , 2. , 3. ], [ 0.28647107, 0.95755263, 0.5378722 ], [ 0.73731078, 0.8777235 , 0.75866665]])]
  • 请编辑问题并将这些代码和预期输出添加到其中。很难读取 cmets。
  • In[5]:[triangle for triangle in t if v0 in triangle ]

标签: arrays numpy filter


【解决方案1】:

你可以简单地做 -

t[(t==v0).all(axis=-1).any(axis=-1)]

我们正在沿着最后一个轴执行ALLANY 缩减,axis=-1 在那里。首先.all(axis=-1) 查找完全匹配 数组v0 的行,然后后者.any(axis=-1) 在每个2DANY 匹配 /em> 块。这会产生一个长度与输入数组长度相同的布尔数组。因此,我们使用布尔数组从输入数组中过滤掉有效元素。

【讨论】:

  • 非常感谢。这么简单……-1 代表什么?
  • @user9258411 添加了一些解释。
猜你喜欢
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 2018-08-06
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
相关资源
最近更新 更多