Преобразовать массив из 1 и 0 в соответствующее десятичное число - PullRequest
0 голосов
/ 11 июля 2019

У меня есть двумерный массив размером 100x128.Он состоит из 1 и 0 типа d64 int64.Мне нужно преобразовать это для каждого столбца в 16 символов 8 бит с соответствующим десятичным числом.

Например, в меньшем масштабе рассмотрим этот случай 5x8 с 2-битными символами.

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

[0 1 1 0 1 0 1 1],

[1 0 1 0 1 1 0 0],

[1 0 1 1 0 1 1 0],

[1 1 0 0 0 1 0 1]]  

Мне нужно преобразовать это в

[[2 1 1 1],

[1 2 1 3]

[2 2 3 0],

[2 3 1 2],

[3 0 1 1]]. 

Так что в моемВ этом случае мне нужно сначала разделить каждую строку из 128 битов на 8-битные порции и получить десятичное значение соответствующего двоичного числа, что должно дать мне двумерный массив 100x16.

Сначала я попытался преобразовать 2D-массив (100,128) в 3D-массив (100,16,8).Но я не уверен, как сделать двоичное преобразование в десятичное с учетом 3-го измерения в виде двоичных строк.

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

Если вы используете numpy, вы можете сделать что-то вроде:

bits_count = 2
bit_weights = 2**np.arange(2)[::-1]
data = np.array([[1, 0, 0, 1, 0, 1, 0, 1],
 [0, 1, 1, 0, 1, 0, 1, 1], 
 [1, 0, 1, 0, 1, 1, 0, 0],
 [1, 0, 1, 1, 0, 1, 1, 0],
 [1, 1, 0, 0, 0, 1, 0, 1]]
) 
(data.reshape((data.shape[0], -1, 2)) * bit_weights).sum(axis=2)
2 голосов
/ 11 июля 2019

Вы можете reshape, взять матричное произведение каждой битовой последовательности 2 по соответствующим значениям в 2**np.arange(n_bits), что можно сделать с помощью оператора @, затем reshapeеще раз:

n_bits = 2
pows = (2 ** np.arange(n_bits))[::-1]
(np.reshape(a, (-1, n_bits)) @ pows).reshape(-1, a.shape[1]//2)

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