Подтвердить что ты не робот

Numpy boolean array с 1 битовыми записями

Есть ли способ numpy создать массив логических элементов, который использует только 1 бит для каждой записи?

Стандартный тип np.bool - 1 байт, но я использую в 8 раз требуемую память.

В Google я обнаружил, что С++ имеет std::vector<bool>.

4b9b3361

Ответ 1

Возможно, вам стоит взглянуть на bitstring (документация здесь).

Если вы создаете ConstBitArray или ConstBitStream из файла, то он будет использовать mmap и не загружать его в память. В этом случае он не будет изменяться, поэтому, если вы хотите внести изменения, он должен быть загружен в память.

Например, чтобы создать без загрузки в память:

>>> a = bitstring.ConstBitArray(filename='your_file')

или

>>> b = bitstring.ConstBitStream(a_file_object)

Ответ 2

Вы хотите bitarray:

эффективные массивы булевых элементов - расширение C

Этот модуль предоставляет тип объекта, который эффективно представляет массив логических элементов. Bitarrays - это типы последовательностей и ведут себя как обычные списки. Восемь битов представлены одним байтом в непрерывном блоке памяти. Пользователь может выбирать между двумя представлениями; мало-endian и big-endian. Все функциональные возможности реализованы в C. Предоставляются методы доступа к представлению машины. Это может быть полезно, когда требуется доступ к битовому доступу к двоичным файлам, например портативные файлы растровых изображений (.pbm). Кроме того, при работе со сжатыми данными, использующими кодировку с переменной длиной бита, вы можете найти этот модуль полезным...

Ответ 3

Для этого вы можете использовать numpy native packbits и unpackbits. Первая функция проста в использовании, но для восстановления вам потребуются дополнительные манипуляции. Вот пример:

import numpy as np
# original boolean array
A1 = np.array([
    [0, 1, 1, 0, 1],
    [0, 0, 1, 1, 1],
    [1, 1, 1, 1, 1],
], dtype=np.bool)

# packed data
A2 = np.packbits(A1, axis=None)

# checking the size
print len(A1.tostring()) # 15 bytes
print len(A2.tostring()) #  2 bytes (ceil(15/8))

# reconstructing from packed data. You need to resize and reshape
A3 = np.unpackbits(A2, axis=None)[:A1.size].reshape(A1.shape).astype(np.bool)

# and the arrays are equal
print np.array_equal(A1, A3) # True