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]
我正在编写一个具有常见场景的算法。我有两个大的整数数组。称它们为 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]