簡體   English   中英

替換Scipy(Python)創建的稀疏矩陣中的元素

[英]Replace elements in sparse matrix created by Scipy (Python)

我在Scipy中有一個龐大的稀疏矩陣,我想用給定值(假設-1 )替換內部的許多元素。

有沒有比使用以下方法更有效的方法:

SM[[rows],[columns]]=-1

這是一個例子:

Nr=seg.shape[0] #size ~=50000

Im1=sparse.csr_matrix(np.append(np.array([-1]),np.zeros([1,Nr-1])))
Im1=sparse.csr_matrix(sparse.vstack([Im1,sparse.eye(Nr)]))
Im1[prev[1::]-1,Num[1::]-1]=-1 # this line is very slow

Im2=sparse.vstack([sparse.csr_matrix(np.zeros([1,Nr])),sparse.eye(Nr)])

IM=sparse.hstack([Im1,Im2]) #final result

我玩過你的sparse數組。 我建議您對較小的尺寸進行一些計時,以了解不同的方法和稀疏類型的行為。 我喜歡在Ipython使用timeit

Nr=10 # seg.shape[0] #size ~=50000
Im2=sparse.vstack([sparse.csr_matrix(np.zeros([1,Nr])),sparse.eye(Nr)])

Im2的第一行為零,其余行的對角線偏移。 因此,從一個空的稀疏矩陣開始比較簡單,盡管速度並不快:

X = sparse.vstack([sparse.csr_matrix((1,Nr)),sparse.eye(Nr)])

或使用diags直接構建偏移對角線:

X = sparse.diags([1],[-1],shape=(Nr+1, Nr))

Im1與之類似,除了在(0,0)插槽中具有-1 堆疊2個對角矩陣怎么樣?

X = sparse.vstack([sparse.diags([-1],[0],(1,Nr)),sparse.eye(Nr)])

或將偏移量Im2對角線(復制Im2 ?),然后修改[0,0] csr矩陣會發出效率警告,建議使用lil格式。 但是,轉換tolil()確實需要一些時間。

X = sparse.diags([1],[-1],shape=(Nr+1, Nr)).tolil()
X[0,0] = -1  # slow warning with csr

讓我們嘗試更大的插入量:

prev = np.arange(Nr-2)  # what are these like?
Num = np.arange(Nr-2)
Im1[prev[1::]-1,Num[1::]-1]=-1

使用Nr=10以及各種Im1格式:

lil - 267 us
csr - 1.44 ms
coo - not supported
todense - 25 us

好的,我選擇了prevNum ,以便最終修改了Im1對角線。 在這種情況下,從一開始就構建那些對角線會更快。

X2=Im1.todia()
print X2.data
[[ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]
 [-1. -1. -1. -1. -1. -1. -1.  0.  0.  0.]]
print X2.offsets
[-1  0]

您可能必須學習如何存儲各種稀疏格式。 csrcsc有點復雜,設計用於快速線性代數運算。 lildiacoo更容易理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM