2017-02-10 56 views
-2

布爾矩陣我要處理大量的數據(300×4×140萬整數數組),這是圍繞如何創建在numpy的

4byte * 300 * 4 * 1400000 = 6.72GB 

然而,這個數組只包含0或1。所以,如果我可以使用布爾數組,然後大小會縮小到原始數據的6.25%。

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

有沒有什麼辦法可以在numpy中使用布爾數組?

編輯: 我不知道爲什麼他刪掉了他的答案,但這個也正是我想要的。

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類型。你可以通過標準的numpy方法來獲得布爾數組a.astype(bool),array(...,dtype = bool)等。

+0

謝謝。我使用h5py從.mat數據文件加載數組。看起來即使數據只包含0和1,我也會得到整型數組。所以我將使用dtype = np.bool參數將其轉換爲布爾數組。 – takataka

+0

@takataka我認爲hdf5使用或能夠使用壓縮,這將大大減少浪費。不確定「matlab-hdf5」究竟做了什麼。無論如何,你的計劃對我來說看起來不錯。 –