在scipy中扩展现有矩阵

时间:2013-06-30 03:25:29

标签: python arrays numpy matrix scipy

我有一个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

2 个答案:

答案 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。