2013-06-30 46 views
2

现有的矩阵我有一个N * N矩阵:延伸SciPy的

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

由于语法不正确,您的编辑不起作用 - 使用'sp.vstack([c,sp.coo_matrix((1,3))])''。请注意,创建矩阵的参数始终是一个元组。 – talonmies

回答

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。

0

看起来你是不是分配todense()的输出。

尝试:

c_dense = c.todense() 
sp.vstack([c_dense,sp.coo_matrix(1,3)])