Вы можете использовать np.unpackbits :
a=np.array([-1,0,1]) # dtype is np.int32
Вы должны ввести свои данные как np.uint8
, потому что это единственный тип данных, поддерживаемый unpackbits:
bi = np.unpackbits(a[:,None].view(np.uint8), axis=1)
Исходные входные данные имеют размер 32 бита, поэтому для каждого элемента ввода вы получаете 32 значения, соответственно обрезайте их (учитывая минимальные / максимальные значения в a
):
result = bi[:, :8]
array([[1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1]], dtype=uint8)
Редактировать:
Это хорошо работает для небольших чисел, таких как в ответе.Если вам нужно более 8 бит, вы должны прочитать первые 8 элементов bi
, а затем с 16 по 8 элементы.Это немного грязно.
Для более общего решения, просто лучше перевернуть массив view
.Обрезка перед распаковкой даст вам некоторое улучшение производительности:
def int_to_bin(arr, n_bytes=1):
# arr is 1-D
arr_ = np.fliplr(arr[:, None].view(np.uint8))[:, -n_bytes:]
return np.unpackbits(arr_, axis=1)
Вы можете обрезать вывод дальше, если вы хотите, скажем, только 4 бита.Это займет около 10 мс для миллиона arr
из int32
.