问题描述
您应该能够对此进行矢量化处理,例如
>>> 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
)。如果m
是3
则2
应该转换(0,0)
。
我试过了,np.unpackbits(np.uint8(num))
但是没有给出正确长度的数组。例如,
np.unpackbits(np.uint8(15))
Out[5]: array([0,1],dtype=uint8)
我想要一种适用m
于代码中所有内容的方法。