在没有按位相交的情况下进行numpy广播按位联合

时间:2018-08-01 23:40:45

标签: python arrays numpy bitwise-operators numpy-broadcasting

我正在编写一种有常见情况的算法。我有两个大的整数数组。将它们称为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

对于每两个数组,我想将所有结果输出到一个1d数组中。如我们所见,使用上述方法,我将输出到不同的数组。我想我可以使用某种连接方法,但是我也对数组了解不多,这可能会比较耗时。我可以就如何有效地完成此操作使用一些建议。

谢谢。

1 个答案:

答案 0 :(得分:1)

问题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]