numpy二进制表示法快速生成

时间:2016-09-19 18:49:12

标签: python numpy

假设我有一个带有numpy元素的n向量,所以我想将此向量中的数字编码为二进制表示法,因此得到的形状将为(n,m)其中{ {1}}例如m

log2(maxnumber)

因为我的最大数字是x = numpy.array([32,5,67]) ,我需要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]]) 到numpy数组。现在我必须迭代结果,并将每个位分别放在一起:

numpy.binary_repr

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

2 个答案:

答案 0 :(得分:3)

这里有一种使用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)

答案 1 :(得分:1)

您可以使用numpy字节字符串。

对于你手头的情况:

res = numpy.array(len(x),dtype='S7')
for i in range(len(x)):
    res[i] = numpy.binary_repr(x[i])

或更紧凑

res = numpy.array([numpy.binary_repr(val) for val in x])