2014-10-07 165 views
2

我需要在numpy/scipy中迭代構建一個巨大的稀疏矩陣。該intitialization是一個循環中完成:巨大的python稀疏矩陣

from scipy.sparse import dok_matrix, csr_matrix 

def foo(*args): 
    dim_x = 256*256*1024 
    dim_y = 128*128*512 
    matrix = dok_matrix((dim_x, dim_y))  

    for i in range(dim_x): 
     # compute stuff in order to get j 
     matrix[i, j] = 1. 
    return matrix.tocsr() 

那麼我需要因爲進一步的計算類似的將其轉換爲一個csr_matrix,:

matrix = foo(...) 
result = matrix.T.dot(x) 

這是工作的罰款開始。但是我的矩陣越來越大,我的電腦開始崩潰。在存儲矩陣中有更優雅的方法嗎?

基本上我有以下要求:

  • 的矩陣需要存儲浮點值形式0.〜1
  • 我需要計算矩陣的轉置
  • 我需要計算點積與x_dimensional矢量
  • 矩陣尺寸可以是大約1 * 10^9×1 * 10^8

我夯存儲超過。我正在讀堆棧溢出和其他互聯網上的幾篇文章;)我發現PyTables,這不是真正的矩陣計算...等等。有沒有更好的方法?

+0

我認爲這可能是更多的數學/數值分析問題:)在我的Num.Anal。當然,做這種大小的矩陣的唯一方法是使它成爲三角形。 – 2014-10-07 03:23:51

+0

另外,我知道你要求的是numpy,但是我有一個有點完成的python庫。 [這是在github上](https:// github。com/Twoody/Lin_Alg_py) – 2014-10-07 03:26:11

+0

當你問這個問題時,看起來你想存儲浮動塊,但是你接受了一個提示int的答案。我只是好奇 - 我在這裏錯過了什麼?謝謝! – 2016-02-21 20:20:30

回答

2

您可能已經達到了Python可以爲您做的極限,或者您可能可以做更多一點。嘗試設置np.float32的數據類型,如果您位於64位計算機上,則精度降低可能會降低您的內存消耗。 np.float16可以幫助你記憶,甚至進一步,但你的計算速度可能會變慢(我見過的例子,其中處理可能需要10倍的時間量):

matrix = dok_matrix((dim_x, dim_y), dtype=np.float32)  

或可能慢得多,甚至可能不如內存消耗:

matrix = dok_matrix((dim_x, dim_y), dtype=np.float16)  

另一種選擇:購買更多的系統內存。


最後,如果你能避免dok_matrix創建矩陣,可以與csr_matrix而不是創建它(我不知道這是可能你的計算),你可以保存在字典有點開銷dok_matrix使用。

2

對於你的情況我建議你使用的數據類型np.int8(或np.uint8),這需要每個元素只有一個字節:

matrix = dok_matrix((dim_x, dim_y), dtype=np.int8) 

直接構建csr_matrix也將讓你與矩陣最大規模走得更遠:

from scipy.sparse import csr_matrix 

def foo(*args): 
    dim_x = 256*256*1024 
    dim_y = 128*128*512 
    row = [] 
    col = [] 

    for i in range(dim_x): 
     # compute stuff in order to get j 
     row.append(i) 
     col.append(j) 
    data = np.ones_like(row, dtype=np.int8) 

    return csr_matrix((data, (row, col)), shape=(dim_x, dim_y), dtype=np.int8)