我有一个N * N矩阵:
N=3
x = scipy.sparse.lil_matrix( (N,N) )
for _ in xrange(N):
x[random.randint(0,N-1),random.randint(0,N-1)]=random.randint(1,100)
假设矩阵如下所示:
X Y Z
X 0 [2,3] [1,4]
Y [2,3] 0 0
Z [1,4] 0 0
如何在不干扰现有值的情况下添加N + 1顶点?
X Y Z A
X 0 [2,3] [1,4] 0
Y [2,3] 0 0 0
Z [1,4] 0 0 [1]
是否需要重新构建整个矩阵? 当我尝试使用vstack添加新行时,我收到错误:
>>> import scipy.sparse as sp
>>> c=sp.coo_matrix(x)
>>> c.todense()
matrix([[ 1., 3., 5.],
[ 2., 6., 4.],
[ 8., 2., 10.]])
>>> sp.vstack([c,sp.coo_matrix(1,3)])
Traceback (most recent call last):
File "<pyshell#41>", line 1, in <module>
sp.vstack([c,sp.coo_matrix(1,3)])
File "c:\working\QZPkgs\eggs\scipy-0.10.1-py2.6-win32.egg\scipy\sparse\construct.py", line 293, in vstack
return bmat([ [b] for b in blocks ], format=format, dtype=dtype)
File "c:\working\QZPkgs\eggs\scipy-0.10.1-py2.6-win32.egg\scipy\sparse\construct.py", line 355, in bmat
raise ValueError('blocks[:,%d] has incompatible column dimensions' % j)
ValueError: blocks[:,0] has incompatible column dimensions
答案 0 :(得分:0)
看起来您没有分配todense()
的输出。
尝试:
c_dense = c.todense()
sp.vstack([c_dense,sp.coo_matrix(1,3)])
答案 1 :(得分:0)
有很多方法可以做到这一点,具体取决于您添加到矩阵后期望矩阵的样子。如果要在矩阵中添加行,请使用sparse.vstack
:
from scipy import sparse
from numpy import random
N=3
x = sparse.lil_matrix( (N,N) )
for _ in xrange(N):
x[random.randint(0,N-1),random.randint(0,N-1)]=random.randint(1,100)
x = sparse.vstack([x, sparse.lil_matrix((1,3))])
如果您希望线性系统具有一定的自由度,以便生成的矩阵为方形,请使用sparse.bmat
代替sparse.vstack
:
x = sparse.bmat([ [x, None], [None,sparse.lil_matrix((1,1))] ])
在第一个例子中,x从3x3扩展到4x3,而在第二个例子中,x扩展到4x4。