在 numpy 中,我想制作一个 2d arrray (r, by 2**r),其中列都是可能的二进制列。
例如,如果列的高度为 5,则列将是
[0,0,0,0,0], [0,0,0,0,1], [0,0,0,1,0], [0,0,0,1,1], [0,0,1,0,0], ...
我的解决方案是
np.array(list(itertools.product([0,1],repeat = c))).T
这看起来非常难看。有没有更优雅的方式?
最佳答案
你可以在这里使用一些 broadcasting
,就像这样 -
(((np.arange(2**r)[:,None] & 2**np.arange(r)[::-1]))>0).astype(int)
对于
r
和 0
之间的 8
,您还可以使用 np.unpackbits
-np.unpackbits(np.arange(2**r,dtype='uint8')[:,None], axis=1)[:,8-r:]
运行时测试 -
案例#1(原始
r = 5
):In [217]: r = 5
In [218]: from itertools import product
In [219]: %timeit np.array(list(product([0,1], repeat=5)))
10000 loops, best of 3: 33.9 µs per loop
In [220]: %timeit np.unpackbits(np.arange(2**r,dtype='uint8')[:,None], axis=1)[:,8-r:]
100000 loops, best of 3: 10.6 µs per loop
In [221]: %timeit (((np.arange(2**r)[:,None] & 2**np.arange(r)[::-1]))>0).astype(int)
10000 loops, best of 3: 31.1 µs per loop
案例#2(更大的
r
):In [242]: r = 15
In [243]: %timeit (((np.arange(2**r)[:,None] & 2**np.arange(r)[::-1]))>0).astype(int)
100 loops, best of 3: 6.6 ms per loop
In [244]: %timeit np.array(list(product([0,1], repeat=r)))
10 loops, best of 3: 77.5 ms per loop
关于python - 用所有可能的列制作二维数组的优雅方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33036759/