python – 使用所有可能列创建二维数组的优雅方法

在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)

对于0到8之间的r,您也可以使用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 – 使用所有可能列创建二维数组的优雅方法 - 代码日志