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

ele*_*ora 7 python numpy

在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], ...
Run Code Online (Sandbox Code Playgroud)

我的解决方案是

 np.array(list(itertools.product([0,1],repeat = c))).T
Run Code Online (Sandbox Code Playgroud)

这看起来很难看.有更优雅的方式吗?

Div*_*kar 4

你可以在这里使用一些broadcasting,就像这样 -

\n\n
(((np.arange(2**r)[:,None] & 2**np.arange(r)[::-1]))>0).astype(int)\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于和r之间,您还可以使用-08np.unpackbits

\n\n
np.unpackbits(np.arange(2**r,dtype=\'uint8\')[:,None], axis=1)[:,8-r:]\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

运行时测试 -

\n\n

案例#1(原始r = 5):

\n\n
In [217]: r = 5\n\nIn [218]: from itertools import product\n\nIn [219]: %timeit np.array(list(product([0,1], repeat=5)))\n10000 loops, best of 3: 33.9 \xc2\xb5s per loop\n\nIn [220]: %timeit np.unpackbits(np.arange(2**r,dtype=\'uint8\')[:,None], axis=1)[:,8-r:]\n100000 loops, best of 3: 10.6 \xc2\xb5s per loop\n\nIn [221]: %timeit (((np.arange(2**r)[:,None] & 2**np.arange(r)[::-1]))>0).astype(int) \n10000 loops, best of 3: 31.1 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

案例#2(较大r):

\n\n
In [242]: r = 15\n\nIn [243]: %timeit (((np.arange(2**r)[:,None] & 2**np.arange(r)[::-1]))>0).astype(int)\n100 loops, best of 3: 6.6 ms per loop\n\nIn [244]: %timeit np.array(list(product([0,1], repeat=r)))\n10 loops, best of 3: 77.5 ms per loop\n
Run Code Online (Sandbox Code Playgroud)\n