替换由Scipy(Python)创建的稀疏矩阵中的元素

时间:2014-05-26 11:51:41

标签: python scipy sparse-matrix

我在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

1 个答案:

答案 0 :(得分:1)

我玩过你的sparse数组。我鼓励你在较小的尺寸上做一些计时,看看不同的方法和稀疏类型如何表现。我想在timeit中使用Ipython

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类似,只是在-1广告位中有(0,0)。如何堆叠2个对角矩阵?

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

或制作偏移对角线(复制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更容易理解。