numpy 二进制符号快速生成

Ser*_*nin 5 python numpy

假设,我有一个numpy与向量n的元素,所以我想编码序数在该载体作为二进制符号,所以得到的形状将是(n,m)其中mlog2(maxnumber)例如:

x = numpy.array([32,5,67])
Run Code Online (Sandbox Code Playgroud)

因为我拥有的最大数量是67,我需要numpy.ceil(numpy.log2(67)) == 7位来编码这个向量,所以结果的形状将是(3,7)

array([[1, 0, 0, 0, 0, 1, 1],
       [0, 0, 0, 0, 1, 0, 1],
       [0, 1, 0, 0, 0, 0, 0]])
Run Code Online (Sandbox Code Playgroud)

问题出现是因为我没有快速的方法将二进制表示法从
函数移动numpy.binary_repr到 numpy 数组。现在我必须迭代结果,并将每一位分别放置:

brepr = numpy.binary_repr(x[i],width=7)
j = 0
for bin in brepr:
   X[i][j] = bin
   j += 1
Run Code Online (Sandbox Code Playgroud)

这是非常耗时和愚蠢的方式,如何使其高效?

Kas*_*mvd 4

这是一种使用np.unpackbits和广播的方式:

>>> max_size = np.ceil(np.log2(x.max())).astype(int)
>>> np.unpackbits(x[:,None].astype(np.uint8), axis=1)[:,-max_size:]
array([[0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 1],
       [1, 0, 0, 0, 0, 1, 1]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)