2014-01-16 73 views
2

我有二維numpy陣列(raster_data),其柵格大小爲100萬* 100萬。 我想是光柵分爲兩類如下:加速NumPy中的代碼

class_A = np.where((raster_data >= 5.23) & (raster_data < 8.55),raster_data,np.nan) 
class_B = np.where((raster_data >= 8.55) & (raster_data < 10.0),raster_data,np.nan) 

然而,由於非常大的大小的數據我收到內存錯誤。 我還能如何按照我的意願對該柵格進行分類? 我已經嘗試過使用16GB RAM和64位NumPy。

+1

爲什麼問題是內存時的標題速度? – cyborg

+2

1e6 x 1e6物品的數組有1億(1e12)個物品。即使你存儲了一個單一的位,你需要125GB **來存儲你的'raster_data'數組**,單精度浮點數需要4TB的內存...... – Jaime

+0

答案取決於你要去的是什麼處理類,類中有多少元素(稀疏矩陣?),以及如何存儲數據。 – cyborg

回答

3

你可以試試布爾索引和就地操作,以節省內存:如果數據集確實是你指定爲瘋狂大

>>> class_A = raster_data.copy() 
>>> class_B = raster_data.copy() 
>>> mask = raster_data < 5.23 
>>> mask |= raster_data >= 8.55 
>>> class_A[mask] = np.nan 
>>> mask = raster_data < 8.55 
>>> mask |= raster_data >= 10 
>>> class_B[mask] = np.nan 
+0

不,這裏的'mask'是OP問題中的條件的否定:他正在選擇在哪裏保存'raster_data'的值,我正在尋找'np.nan'的值。因爲'〜(a&b)==〜a |,所以注意不是'&' - 這兩個條件都是'| - ' 〜B'。 – Jaime

0

,你將需要某種形式的磁盤上存儲和OUT-核心計算。

這一切都取決於你想要用那個面具做什麼,但看看pytables;它允許對這種大型陣列進行有效的存儲和操作。

3

這就是你如何使用pytables來完成的。雖然我希望你耐心,有很大的空間。

import tables as tb 
import numpy as np 
import time 

f = tb.openFile('humongusFile.h5', 'w') 

n = 100000 
x = f.createCArray(f.root, 'x', tb.Float16Atom(), (n,n), filters=tb.Filters(5, 'blosc')) 



t0 = time.time() 

for i in range(n): 
    x[i] = np.random.random_sample(n)* 10 
x.flush() # dump data to disk 

t1 = time.time() 
print t1 - t0 
print "Done creating test data" 

y1 = f.createCArray(f.root, 'y1', tb.Float16Atom(), (n,n), filters=tb.Filters(5, 'blosc')) 
y2 = f.createCArray(f.root, 'y2', tb.Float16Atom(), (n,n), filters=tb.Filters(5, 'blosc')) 

t2 = time.time() 
print t2 - t1 
print "Done creating output array" 

expr = tb.Expr("where((x >= 5.23) & (x < 8.55), x, 0)") 
expr.setOutput(y1) 

expr2 = tb.Expr("where((x >= 5.23) & (x < 8.55), x, 0)") 
expr2.setOutput(y2) 

t3 = time.time() 
print t3 - t2 
print "Starting evaluating first output" 
expr.eval() 
print "Starting evaluating second output" 
expr2.eval() 
print "Done" 
t4 = time.time() 
print t4 - t3 
+0

你用PyTables實現真的很好,但是在你的表達式中使用np.nan的值不可能是零嗎? – 2014-03-07 13:03:38

+0

@rockpy我不確定PyTables是否支持nan值。但是,您通常可以「定義」一個永遠不會出現在您的數據中的值。 – M4rtini