我有一個csr_matrix'a'類型的稀疏矩陣。我想執行一個操作來創建一個新的csr_matrix'b',其中'b'的每一行與'a'的一行相同。瓷磚操作從另一個csr_matrix的一行創建csr_matrix
我認爲對於普通的numpy數組,可以使用'tile'操作。但我無法找到相同的csr_matrix。
首先製作一個numpy的矩陣,並轉換爲csr_matrix是不是一種選擇,因爲矩陣的尺寸爲10000×10000
我有一個csr_matrix'a'類型的稀疏矩陣。我想執行一個操作來創建一個新的csr_matrix'b',其中'b'的每一行與'a'的一行相同。瓷磚操作從另一個csr_matrix的一行創建csr_matrix
我認爲對於普通的numpy數組,可以使用'tile'操作。但我無法找到相同的csr_matrix。
首先製作一個numpy的矩陣,並轉換爲csr_matrix是不是一種選擇,因爲矩陣的尺寸爲10000×10000
有一個blk
格式,讓你從其他列表中創建一個新的稀疏矩陣矩陣。所以一開始
你可以
a1 = a[I,:]
ll = [a1,a1,a1,a1]
sparse.blk_matrix(ll)
我沒有運行測試這個殼。
該格式的內部格式將所有輸入數組轉換爲coo
格式,並將它們的coo
屬性收集到3個大型列表(或數組)中。在你平鋪行的情況下,data
和col
(j)的值會重複。 row
(I)值將會一步。
接近它的另一種方法是構造一個小的測試矩陣,並查看屬性。你看到什麼樣的重複?很容易看到格式爲coo
的圖案。 lil
也可能很容易複製,也許與清單*n
操作。 csr
更難理解。
我實際上可以得到答案,不需要創建完整的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
也沒有創造LL打算採取了一大堆的內存。它不會破壞稀疏矩陣的目的嗎? – Naman
另外我想我可以達到解決方案,所以我添加它作爲答案。如果感興趣,請看看。 – Naman
直接創建'csr'會更緊湊一些,因爲'indptr'屬性比等效的'coo'行更短。 – hpaulj