2017-02-10 19 views
-2

мне приходится иметь дело с большими данными (300 по 4 по 1400000 массива целых чисел), которая вокругКак создать булеву массив в NumPy

4byte * 300 * 4 * 1400000 = 6.72GB 

Однако этот массив содержит только 0 или 1. Таким образом, если Я мог бы использовать логический массив, тогда размер уменьшился бы до 6,25% от исходных данных.

6.72GB/4bytes/8bits/bytes * 2 = 420Mbits 

Есть ли способ использовать булевы массивы в numpy?

EDIT: Я не знаю, почему он удалил свой ответ, но это сделало именно то, что я хотел.

arr = np.ones((300,2,1400000), dtype = np.bool) 

Это приводит к сжатию 12,5%.

>>> arr = np.ones((300,2,1400000), dtype = np.bool) 
>>> arr.nbytes 
840000000 

>>> arr = np.ones((300,2,1400000)) 
>>> arr.nbytes 
6720000000 

840000000/6720000000 = 12.5% 
+0

«этот массив содержит только 0 или 1 ... каждый элемент имеет 2 бита» - Что, что? Как это сделать, чтобы представить это 2 бита? – user2357112

ответ

0

Это даст вам скидку в 75%, по четыре байта на один байт на один элемент.

bool_array = np.logical_and(int_array, True) 
1

Хотя есть способ манипулировать «битовые поля» в numpy они не предлагают удобства соответствующих Numpy массивов на уровне битов.

При этом numpy имеет «логические» или «логические» массивы, то есть массивы с dtype bool. Они берут только один байт на элемент и являются правильными массивами. Когда ваш массив создается с помощью операции «логического массива», например, b = (a > 0), он (b) будет автоматически иметь тип bool. Вы можете получить логические массивы стандартными способами num.astype (bool), array (..., dtype = bool) и т. Д.

+0

Спасибо. Я использую h5py для загрузки массивов из файла данных .mat. Кажется, что даже если данные содержат только 0 и 1, я получаю целые массивы. поэтому я буду использовать параметр dtype = np.bool, чтобы преобразовать его в массив bool. – takataka

+0

@takataka Я думаю, что hdf5 использует или может использовать компрессию, которая значительно облегчила бы отходы. Не уверен, хотя то, что именно делает «matlab-hdf5». Во всяком случае, ваш план выглядит хорошо для меня. –