2012-01-27 163 views
1

說我有一個巨大的numpy矩陣A佔用數十千兆字節。分配此內存需要花費不可忽視的時間。加載到現有的numpy密集矩陣稀疏scipy矩陣

假設我也有一個與numpy矩陣具有相同尺寸的scipy稀疏矩陣的集合。有時我想將這些稀疏矩陣之一轉換爲稠密矩陣來執行一些向量化操作。

我可以將這些稀疏矩陣之一加載到A而不是每次我想將稀疏矩陣轉換爲稠密矩陣時重新分配空間嗎?可用於scipy稀疏矩陣的.toarray()方法似乎沒有采用可選的密集數組參數,但也許有其他方法可以執行此操作。

回答

2

如果稀疏矩陣是在COO格式:

def assign_coo_to_dense(sparse, dense): 
    dense[sparse.row, sparse.col] = sparse.data 

如果是在CSR格式:

def assign_csr_to_dense(sparse, dense): 
    rows = sum((m * [k] for k, m in enumerate(np.diff(sparse.indptr))), []) 
    dense[rows, sparse.indices] = sparse.data 

爲了安全起見,你可能要添加以下行上述各功能的開頭:

assert sparse.shape == dense.shape 
dense[:] = 0 
1

看起來好像應該有更好的方法來做到這一點(而且我還沒有研究過文檔),但是你總是可以遍歷稀疏數組的元素並分配給密集數組(可能歸零首先密集陣列)。如果這最終過於緩慢,這似乎是一個簡單的C擴展編寫....

+1

它TU發現將每個稀疏數組轉換爲一個密集數組(每次分配大量內存)要比遍歷稀疏數組的所有元素並將元素加載到預先分配的密集數組更快。我沒有嘗試寫C擴展。 – conradlee 2012-01-30 12:21:28