Есть ли способ numpy создать массив логических элементов, который использует только 1 бит для каждой записи?
Стандартный тип np.bool
- 1 байт, но я использую в 8 раз требуемую память.
В Google я обнаружил, что С++ имеет std::vector<bool>
.
Есть ли способ numpy создать массив логических элементов, который использует только 1 бит для каждой записи?
Стандартный тип np.bool
- 1 байт, но я использую в 8 раз требуемую память.
В Google я обнаружил, что С++ имеет std::vector<bool>
.
Возможно, вам стоит взглянуть на bitstring (документация здесь).
Если вы создаете ConstBitArray
или ConstBitStream
из файла, то он будет использовать mmap
и не загружать его в память. В этом случае он не будет изменяться, поэтому, если вы хотите внести изменения, он должен быть загружен в память.
Например, чтобы создать без загрузки в память:
>>> a = bitstring.ConstBitArray(filename='your_file')
или
>>> b = bitstring.ConstBitStream(a_file_object)
Вы хотите bitarray:
эффективные массивы булевых элементов - расширение C
Этот модуль предоставляет тип объекта, который эффективно представляет массив логических элементов. Bitarrays - это типы последовательностей и ведут себя как обычные списки. Восемь битов представлены одним байтом в непрерывном блоке памяти. Пользователь может выбирать между двумя представлениями; мало-endian и big-endian. Все функциональные возможности реализованы в C. Предоставляются методы доступа к представлению машины. Это может быть полезно, когда требуется доступ к битовому доступу к двоичным файлам, например портативные файлы растровых изображений (.pbm). Кроме того, при работе со сжатыми данными, использующими кодировку с переменной длиной бита, вы можете найти этот модуль полезным...
Для этого вы можете использовать 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