Как вы правильно заметили, 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)
массив с точными значениями, которые вы хотите.