假设我有一个带有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
这是非常耗时和愚蠢的方式,如何提高效率?
答案 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])