假设,我有一个numpy与向量n的元素,所以我想编码序数在该载体作为二进制符号,所以得到的形状将是(n,m)其中m 是log2(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)
这是非常耗时和愚蠢的方式,如何使其高效?
这是一种使用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)