使用适当的填充将整数转换为二进制数组

问题描述

您应该能够对此进行矢量化处理,例如

>>> d = np.array([1,2,3,4,5])
>>> m = 8
>>> (((d[:,None] & (1 << np.arange(m)))) > 0).astype(int)
array([[1, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0, 0, 0],
       [1, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 0],
       [1, 0, 1, 0, 0, 0, 0, 0]])

它只是获得适当的位权重,然后按位取和:

>>> (1 << np.arange(m))
array([  1,   2,   4,   8,  16,  32,  64, 128])
>>> d[:,None] & (1 << np.arange(m))
array([[1, 0, 0, 0, 0, 0, 0, 0],
       [0, 2, 0, 0, 0, 0, 0, 0],
       [1, 2, 0, 0, 0, 0, 0, 0],
       [0, 0, 4, 0, 0, 0, 0, 0],
       [1, 0, 4, 0, 0, 0, 0, 0]])

有很多方法将其转换为1秒无论它是非零的(> 0)*1.astype(bool).astype(int)等我选择了一个基本上是随机的。

解决方法

我的整数范围是0..2**m - 1,我想将它们转换为length的二进制numpy数组m。例如,说m = 4。现在15 =1111为二进制,因此输出应为(1,1,1)2 = 10以二进制形式,因此输出应为(0,0)。如果m32应该转换(0,0)

我试过了,np.unpackbits(np.uint8(num))但是没有给出正确长度的数组。例如,

np.unpackbits(np.uint8(15))
Out[5]: array([0,1],dtype=uint8)

我想要一种适用m于代码中所有内容的方法。