2017-04-06 164 views
0

我目前正在嘗試做一個非常大的矩陣,我不確定如何以內存有效的方式做到這一點。內存高效的方法來使大零矩陣python

我正在嘗試使用numpy,它適用於我的小案例(2750086X300) 但是,我得到了一個較大的2750086X1000,這對我來說太大了,無法運行。

我雖然關於如何使用ints,但我會添加float值,因此不確定cld如何影響它。

我試圖找到一些關於做一個稀疏的零填充數組,但cldnt在這裏或其他地方找到任何偉大的主題/問題/建議。

任何人有任何好建議?我目前正在使用python,所以我尋找pythonic解決方案,但我願意嘗試其他語言。

THX


編輯:

THX的建議,我已經試過scipy.sparse.csr_matrix它成功地創建一個矩陣,但深深增加了時間去通過它。

繼承人樣的我在做什麼:

matrix = scipy.sparse.csr_matrix((df.shape[0], 300)) 
## matrix = np.zeros((df.shape[0], 

for i, q in enumerate(df['column'].values):  

    matrix[i, :] = function(q) 

其中功能是相當多的該行向量運算功能。

現在,如果我在np.zeros上執行循環,那麼它非常容易,大約需要10分鐘。

現在,如果我嘗試做與scipy稀疏矩陣相同,它需要大約50個小時。這是不合理的。

任何建議?


編輯2:

scipy.sparse.lil_matrix的伎倆

約需20 minut的環路,並使用比np.zeros

THX的存儲方式少。


編輯3:

還是內存昂貴。決定不在矩陣中存儲數據。一次處理1行。從中獲得相關的價值/指標,將價值存儲在原始df中,再次運行。

+0

'np.zeros((2750086,1000))'很可能對您的記憶來說太大了,無論是填滿了零還是實數。有一個稀疏矩陣,說只有0.1%的非零可能適合。但是你對這個數組做什麼?按元素填充它將永遠佔用。而任何數組幾乎填滿內存的數學只會產生一些內存錯誤,因爲它會創建臨時緩衝區。 – hpaulj

+0

想一想,使用32位數字至少需要'2750086 * 1000 * 1e-9 * 4 = 11.000344千兆字節。不是完全瘋狂,但相當大。您可以獲得更多RAM或嘗試使用稀疏表示。 –

+0

在'[scipy]稀疏'上搜索以查找有關'[scipy]'中稀疏矩陣包的問題。 'lil','coo'和'csr'也可以作爲唯一的字符串。如果你正在學習或測試處理軟件包,比如'scikit-learn',可能會有用。 – hpaulj

回答

4

嘗試scipy.sparse.csr_matrix

from scipy.sparse import * 
from scipy import * 
a=csr_matrix((2750086,1000), dtype=int8) 

然後a

<2750086x1000 sparse matrix of type '<class 'numpy.int8'>' 
    with 0 stored elements in Compressed Sparse Row format> 

例如,如果你這樣做:

from scipy.sparse import * 
from scipy import * 
a=csr_matrix((5,4), dtype=int8).todense() 
print(a) 

你得到:

[[0 0 0 0] 
[0 0 0 0] 
[0 0 0 0] 
[0 0 0 0] 
[0 0 0 0]] 

另一個選項是使用scipy.sparse.lil_matrix

a = scipy.sparse.lil_matrix((2750086,1000), dtype=int8) 

這似乎是用於設置元素(如a[1,1]=2)更有效。

+0

thx爲偉大的答案。我更新了問題/ upvoted – epattaro

+0

試過lil矩陣,似乎是一個很好的解決方案。謝謝。 – epattaro