在3d数组中过滤包含1d数组的2d数组

时间:2018-06-24 09:23:24

标签: arrays numpy filter

我有一个3d数组(一个三角形数组)。我想获得包含给定点(1d数组)的三角形(2d数组)。 我经历了in1d,在哪里,在哪里,但是我仍然没有成功。...

例如:

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

可以作为一行的测试,但是我无法在整个数组上使用它。 感谢您的帮助。

我的意思是向量化的等效项:

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

1 个答案:

答案 0 :(得分:1)

您可以简单地做-

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

我们正在沿最后一个有ALL的轴执行ANYaxis=-1缩小。首先.all(axis=-1)寻找与数组v0完全匹配的行,然后后者.any(axis=-1)寻找与数组{{1}匹配的行 ANY 每个 2D 块。这将导致布尔数组的长度与输入数组的长度相同。因此,我们使用布尔数组来过滤掉输入数组中的有效元素。