2016-09-19 2 views
3

Предположит, у меня есть numpy вектора с n элементами, поэтому я хотел бы, чтобы закодировать числа в этом векторе в двоичной системе счисления, так что в результате форма будет (n,m) где m является log2(maxnumber), например:NumPy двоичного быстрого поколения

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.binary_repr в массив numpy. Теперь я должен перебрать результат, и положить каждый бит солидарную:

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

Это очень timecost и глупый способ, как сделать его эффективным?

+0

См http://stackoverflow.com/questions/22227595/convert-integer-to-binary-array -с-подходит-обивка –

ответ

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

Вы можете использовать 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]) 
Смежные вопросы