Как распаковать массив uint32 с помощью np.unpackbits - PullRequest
1 голос
/ 23 марта 2020

Я использовал фрагмент кода, чтобы создать двумерный массив с двоичным значением, чтобы охватить все возможные сценарии ios события. В первом раунде я протестировал его с 2 участниками.

Вот мой код:

number_of_members = 2
n = number_of_members
values = np.arange(2**n, dtype=np.uint8).reshape(-1, 1)
print('$$$ ===> ', values)
bin_array = np.unpackbits(values, axis=1)[:, -n:]
print('*** ===> ', bin_array)

И результат такой:

$$$ ===>  [[0]
           [1]
           [2]
           [3]]
*** ===>  [[0 0]
           [0 1]
           [1 0]
           [1 1]]

Как вы можете видите, он правильно предоставил мой 2D двоичный массив.

Проблема начинается, когда я намеревался использовать number_of_members = 20. Если я назначу 20 для number_of_members python, это будет выглядеть как результат:

$$$ ===>  [[  0]
           [  1]
           [  2]
           ...
           [253]
           [254]
           [255]]
*** ===>  [[0 0 0 ... 0 0 0]
           [0 0 0 ... 0 0 1]
           [0 0 0 ... 0 1 0]
           ...
           [1 1 1 ... 1 0 1]
           [1 1 1 ... 1 1 0]
           [1 1 1 ... 1 1 1]]

Результат имеет 8 столбцов, но я ожидал массив из 32 столбцов. Как мне распаковать массив uint32?

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Как вы правильно заметили, np.unpackbits работает только на uint8 массивах. Приятно, что вы можете просмотреть любой тип как uint8. Вы можете создать uint32 view в ваших данных следующим образом:

view = values.view(np.uint8)

На моей машине это little-endian, что облегчает процесс обрезки. Вы можете принудительно установить порядок байтов в любом порядке:

if values.dtype.byteorder == '>' or (values.dtype.byteorder == '=' and sys.byteorder == 'big'):
    view = view[:, ::-1]

Теперь вы можете распаковывать биты. На самом деле, unpackbits имеет приятную особенность, которую я лично добавил, параметр count. Это позволяет вам сделать ваш вывод длиной ровно 20 бит вместо полных 32 без поднабора. Поскольку выходные данные будут смешаны с байтами с прямым порядком байтов и байтами с прямым порядком байтов, я рекомендую также отображать биты в порядке с прямым порядком байтов и отображать весь результат:

bin_array = np.unpackbits(view, axis=1, count=20, bitorder='little')[:, ::-1]

В результате получается (1<<20, 20) массив с точными значениями, которые вы хотите.

0 голосов
/ 23 марта 2020

Я попробовал точный код, который вы написали здесь, и когда number_of_members=20, результат будет values : (1048576, 1) и bin_array : (1048576, 8), который, как я полагаю, является огромным массивом, который вы ожидаете.

И 1048576 = 2^20

np.uint8 works fine

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