2016-04-14 38 views
1

我有一個csr_matrix'a'類型的稀疏矩陣。我想執行一個操作來創建一個新的csr_matrix'b',其中'b'的每一行與'a'的一行相同。瓷磚操作從另一個csr_matrix的一行創建csr_matrix

我認爲對於普通的numpy數組,可以使用'tile'操作。但我無法找到相同的csr_matrix。

首先製作一個numpy的矩陣,並轉換爲csr_matrix是不是一種選擇,因爲矩陣的尺寸爲10000×10000

回答

0

有一個blk格式,讓你從其他列表中創建一個新的稀疏矩陣矩陣。所以一開始

你可以

a1 = a[I,:] 
ll = [a1,a1,a1,a1] 
sparse.blk_matrix(ll) 

我沒有運行測試這個殼。

該格式的內部格式將所有輸入數組轉換爲coo格式,並將它們的coo屬性收集到3個大型列表(或數組)中。在你平鋪行的情況下,datacol(j)的值會重複。 row(I)值將會一步。

接近它的另一種方法是構造一個小的測試矩陣,並查看屬性。你看到什麼樣的重複?很容易看到格式爲coo的圖案。 lil也可能很容易複製,也許與清單*n操作。 csr更難理解。

+0

也沒有創造LL打算採取了一大堆的內存。它不會破壞稀疏矩陣的目的嗎? – Naman

+0

另外我想我可以達到解決方案,所以我添加它作爲答案。如果感興趣,請看看。 – Naman

+1

直接創建'csr'會更緊湊一些,因爲'indptr'屬性比等效的'coo'行更短。 – hpaulj

0

我實際上可以得到答案,不需要創建完整的numpy矩陣,並且對於我的目的來說相當快。所以將其作爲答案,如果它是人們在未來有用:

rows, cols = a.shape 
b = scipy.sparse.csr_matrix((np.tile(a[2].data, rows), np.tile(a[2].indices, rows), 
          np.arange(0, rows*a[2].nnz + 1, a[2].nnz)), shape=a.shape) 

這需要「A」的第2行瓷磚它來創建「B」。

以下是計時測試,似乎爲10000x10000矩陣相當快:

100 loops, best of 3: 2.24 ms per loop 
+1

你的'data'和'indices'平鋪是我爲'coo'建議的,但是你的'indptr'比'coo'要求的要短。 'coo'等價物將使用類似'np.arange(...)。repeat(nnz)','[0,0..0,1,1 ...,2,2 ...] 。 – hpaulj

+0

是的,我錯誤地解釋了你的解決方案。 – Naman