2016-09-27 57 views
1

我已經將一段matlab代碼移植到python中,並且遇到了效率問題。matlab到python端口優化

例如,又來了一個片段:

G = np.vstack((Gx.toarray(), Gy.toarray(), Gd1.toarray(), Gd2.toarray())) 

這裏所有元素堆疊是通過22500 22500 sparce矩陣。它直接死在我的Windows 64位機器上出現以下錯誤:

return _nx.concatenate([atleast_2d(_m) for _m in tup], 0) 
MemoryError 

我是很新的Python中,有沒有對這種優化的最佳做法的任何好文章?任何關於numpy如何與內存配合的信息?

就我所知,以某種壓縮格式存儲的sparce矩陣,佔用的空間少得多,但需要花費更多的時間來處理。

Thx!

+0

你期待一個密集或稀疏矩陣/數組作爲輸出? – Divakar

+0

@Divakar輸出是稀疏的 – Anton

+2

最佳的優化建議是 - 不要嘗試它,直到你的代碼工作。內存錯誤意味着這些密集陣列中的一個或多個佔用了太多的空間,遠遠超過了稀疏矩陣。這是一個嚴格的限制。速度是一個軟的。 – hpaulj

回答

1

堆疊稀疏矩陣,可以使用Scipy sparse's vstack function,而不是與NumPy的vstack一個,像這樣 -

import scipy.sparse as sp 

Gout = sp.vstack((Gx,Gy,Gd1,Gd2)) 

採樣運行 -

In [364]: # Generate random sparse matrices 
    ...: Gx = sp.coo_matrix(3*(np.random.rand(10,10)>0.7).astype(int)) 
    ...: Gy = sp.coo_matrix(4*(np.random.rand(10,10)>0.7).astype(int)) 
    ...: Gd1 = sp.coo_matrix(5*(np.random.rand(10,10)>0.7).astype(int)) 
    ...: Gd2 = sp.coo_matrix(6*(np.random.rand(10,10)>0.7).astype(int)) 
    ...: 

In [365]: # Run original and proposed approaches 
    ...: G = np.vstack((Gx.toarray(), Gy.toarray(), Gd1.toarray(), Gd2.toarray())) 
    ...: Gout = sp.vstack((Gx,Gy,Gd1,Gd2)) 
    ...: 

In [366]: # Finally verify results 
    ...: np.allclose(G,Gout.toarray()) 
Out[366]: True 
+0

謝謝,但有什麼區別?它是否針對稀疏矩陣進行了優化? – Anton

+2

@Anton'Gout'是一個稀疏矩陣,所以它針對內存進行了優化。你評論說你正在尋找一個稀疏矩陣作爲輸出,對吧? – Divakar

+1

'sparse.vstack'直接與稀疏矩陣數據一起工作。它不會將矩陣轉換爲大密度矩陣。但要理解它,你必須瞭解如何存儲稀疏矩陣。 – hpaulj