我有两个数组,A 是一个 (m, 3)
形状的数组,B 是一个 (n, 3)
形状的数组,带有 { {1}}(这个条件总是满足的。实际上 m 至少是 n 的 3 倍)。这两个数组看起来像这样:
m > n
(u, v, w) 和 (x, y, z) 是 3D 点的坐标。 B 中的所有点都存在于 A 中(其中包含的点较多,大部分不在 B 中)。需要注意的一件事是点在 B 中的出现顺序不一定在 A 中相同,这意味着,为了说明起见,[u1 v1 w1] 可以在位置(行)256,[u2 v2 w2] 15,[u3 v3 w3] 在 569001 等
另一个重要的细节:坐标是浮点数,如果两个点对应,则uk = xj, vk = yj, wk = zj(意思是这些点有准确的位置,而不只是彼此靠近)。
我想创建一个与 A 大小相同的布尔掩码,稍后将在代码中使用,以便 A = [[x1 y1 z1] | B = [[u1 v1 w1]
[x2 y2 z2] | [u2 v2 w2]
... | ...
... | [un vn wn]]
... |
... |
[xm ym zm]] |
其中 mask_A = [True, False, False, False, True,..., False]
表示该点也存在于 B 中,而 {{ 1}} 当点没有出现在 B 中时放置。
我也想用它没有任何循环,因为尺寸很大,而且创建蒙版的过程要重复多次。只要能快速完成工作,更改数组的类型(将它们转换为列表、集合等等...)都没有问题。
我找到了多个处理掩码和二维数组的答案,但没有一个回答我的问题。
谢谢。
答案 0 :(得分:2)
由于它们都是 numpy 数组,您可以使用函数 numpy.intersect1d
_, indices_ar1, _ = numpy.intersect1d(ar1, ar2, assume_unique=False, return_indices=True)
我不知道你的申请,但也许这对你来说已经足够了。如果不是,您只需将这些索引转换为二进制掩码。