2012-05-01 65 views
6

我想用空間和時間有效的方式在Python中創建2D二進制(位)數組,因爲我的2D位陣列大約有100萬(行)* 50000( 0或1的列),我也會對這些巨大的元素執行按位操作。我的陣列看起來像:Python空間+省時高效的數據結構來存儲2D位陣列

0 1 0 1 
1 1 1 0 
1 0 0 0 
... 

在C++中最有效的方法(空間),用於我是創建一種,其中每個元素代表32位整數的數組,然後我可以使用加上移位運算符按位運營商進行運營。

現在我知道在Python中有一個bitarray模塊。但我無法使用位陣列列表創建二維結構。我怎樣才能做到這一點?

我在C++中知道的另一種方法是創建一個像map<id, vector<int> >這樣的地圖,然後我可以像上面提到的那樣操縱該向量。我應該使用Python中的字典嗎?

即使你建議我用某種方式使用位數組來完成這個任務,它將會很棒如果我能夠知道我是否可以讓多個線程在一堆bitarray上進行操作,以便我可以使其成爲多線程。謝謝您的幫助!!

編輯:

我甚至可以去創造我自己的數據結構,這如果需要的話。然而,只是想在重新發明輪子之前進行檢查。

+2

它是一個稀疏數組嗎?否則,你將需要〜6GB來存儲所有這些位 –

+1

當數據類型是位時,按位是多餘的:)。也許你可以使用'set'和普通設置操作。該組的成員資格可以表示爲'真' –

+1

只有當您堅持需要使用32位整數(或類似的)才能將位返回時,纔會應用按位運算。 –

回答

5

按我的意見,你可以使用套

0 1 0 1 
1 1 1 0 
1 0 0 0 

可以表示爲

set([(1,0), (3,0), (0,1), (1,1), (2, 1), (0,2)]) 

{(1,0), (3,0), (0,1), (1,1), (2, 1), (0,2)} 

的,相當於一個路口2套
OR是2套的結合

+0

這將是'(3,0)',而不是'(4,0)'。 –

+0

@mteckert,謝謝,修正 –

+0

@Yavar,它們代表每個'1'的(x,y)。在這種情況下,y從頂部開始倒數,但只要您一致,您可以將它們切換爲任何方式 –

4

如何如下:

In [11]: from bitarray import bitarray 

In [12]: arr = [bitarray(50) for i in xrange(10)] 

這將創建一個10x50的位陣列,您可以訪問如下:

In [15]: arr[0][1] = True 

In [16]: arr[0][1] 
Out[16]: True 

記住,一個1Mx50K陣列需要大約6GB內存(以及在64位操作系統上構建的64位Python)。

我是否能有多個線程對bitarray的剪接工作,這樣我可以把它的多線程

這不應該是一個問題,與通常的注意事項。請記住,由於GIL,您不可能通過多線程來實現性能改進。

2

你可以使用numpy嗎?

>>> import numpy 
>>> A = numpy.zeros((50000, 1000000), dtype=bool) 

編輯:似乎不是最有效的空間。使用50GB(每個布爾1個字節)。有誰知道numpy是否有辦法使用packed bools?

相關問題