Numpy 在没有按位交集时广播按位并集

Numpy broadcasting bitwise union upon no bitwise intersection

我正在编写一个具有常见场景的算法。我有两个大的整数数组。称它们为 k 和 j(因为我在测试代码中就是这样称呼它们的)。

我取 k 的每个元素,并取它与 j 的每个元素的并集,但前提是这两个元素的交集为零。

示例:

j = np.zeros(3, dtype=int)
k = np.zeros(3, dtype=int)
k[0] = 2
k[1] = 6
k[2] = 10
j[0] = 2
j[1] = 8
j[2] = 1

for i in xrange(3):
    mask = (j&k[i] == 0)
    nextpart = (j|k[i])[mask]
    print i, nextpart
    print ""

0 [10 3]

1 [14 7]

2 [11]

问题 1

这个方法真的有效吗?我的算法主要基于此处的此操作,因此了解执行此操作的最佳方法会有很大的不同。

问题 2

对于每两个数组,我想将所有结果输出到一个一维数组中。正如我们所看到的,使用上面的方法,我正在输出到不同的数组。我想我可以使用某种连接方法,但我也怀疑基于我对数组的了解,这可能相对耗时。我可以使用一些关于如何有效完成此操作的建议。

谢谢。

问题2有点乱。无论如何,你可以做 $ 和 |使用广播高效操作。

import numpy as np

j = np.zeros(3, dtype=int)
k = np.zeros(3, dtype=int)
k[0] = 2
k[1] = 6
k[2] = 10
j[0] = 2
j[1] = 8
j[2] = 1

# alter shape to broadcast
k_ = k[None].T
r = (j|k_)[j&k_==0]
print(r)

这导致

[10  3 14  7 11]