Преобразовать целочисленный массив в матрицу двоичного представления - PullRequest
3 голосов
/ 10 июля 2019

Учитывая массив целых 1d, например:

[1, 0, -1]

ищет матрицу двоичного представления, желаемый вывод:

[[0 1], [0 0], [1 1]]

возможно, используя np.binary_repr с заданной фиксированной шириной.В настоящее время np.binary_repr возвращает строку и применяется только к одному числу одновременно.

tobin = np.vectorize(np.binary_repr)
tobin(np.arange(4))
# ['0000' '0001' '0010' '0011']

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Вы можете использовать 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.

0 голосов
/ 10 июля 2019

Вот явное решение, основанное на циклах, которое у меня есть на данный момент, и я бы хотел получить векторизованное решение.

def int_to_bin_matrix(arr: np.ndarray, width: int):
  """Return the binary representation of matrix of integer array."""
  return np.array([[int(c) for c in np.binary_repr(i, width=width)] for i in arr], dtype=np.int32)

print(int_to_bin_matrix(np.arange(-2,2), 4))

[[1 1 1 0]
 [1 1 1 1]
 [0 0 0 0]
 [0 0 0 1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...