我有一个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]])]
答案 0 :(得分:1)
您可以简单地做-
t[(t==v0).all(axis=-1).any(axis=-1)]
我们正在沿最后一个有ALL
的轴执行ANY
和axis=-1
缩小。首先.all(axis=-1)
寻找与数组v0
完全匹配的行,然后后者.any(axis=-1)
寻找与数组{{1}匹配的行 ANY
每个 2D 块。这将导致布尔数组的长度与输入数组的长度相同。因此,我们使用布尔数组来过滤掉输入数组中的有效元素。