2014-04-29 16 views
1

運行該代碼Python的例子爲SciPy的dia_matrix

d0 = np.ones(N) 
dp1 = np.ones(N - 1) 
dm1 = np.ones(N - 1) 

diag = [[d0],[dp1],[dm1]] 
offsets = [0,1,-1] 

A = dia_matrix((diag,offsets), shape=(N,N), dtype=float) 

我得到以下錯誤:

File "/usr/local/lib/python2.7/dist-packages/scipy/sparse/dia.py", line 109, in __init__ 
self.data = np.atleast_2d(np.array(arg1[0], dtype=dtype, copy=copy)) 

ValueError異常:設置一個數組元素與一個序列。

我不明白我做錯了什麼!有人能給我一個正確的例子來做我想做的事嗎?

回答

4

dia_matrix的第一個參數的形式(data, offsets)data預計將有2 d陣列,其中的每data列保持一個對角矩陣的。由於data是矩形矩陣,因此忽略data中的一些元素。子對角線「左對齊」,超對角線「右對齊」。 (具體而言,和稀疏矩陣Adata之間的映射是data[i,j] == A[j - offsets[i], j]。)例如,考慮將用於創建一個5x5矩陣如下:

In [28]: data 
Out[28]: 
array([[ 1, 2, 3, 4, 5], 
     [ 6, 7, 8, 9, 10], 
     [11, 12, 13, 14, 15]]) 

In [29]: offsets 
Out[29]: [0, 1, -1] 

data包含三個對角線。由於offset[0]爲0,data的第0行包含主對角線。該行中的所有5個元素都用在矩陣中。 offset[1]爲1,因此中的數據成爲第一個超對角線。只有值[7, 8, 9, 10]將被使用;第一個值6將被忽略。同樣,data的第三行給出了第一個對角線,並且僅使用值[11, 12, 13, 14]

In [32]: N = 5 

In [33]: data = np.ones((3, 5)) 

In [34]: A = dia_matrix((data, offsets), shape=(N, N), dtype=float) 

In [35]: A.A 
Out[35]: 
array([[ 1., 1., 0., 0., 0.], 
     [ 1., 1., 1., 0., 0.], 
     [ 0., 1., 1., 1., 0.], 
     [ 0., 0., 1., 1., 1.], 
     [ 0., 0., 0., 1., 1.]]) 

dia_matrix文檔字符串有另外一個例子:

In [30]: a = dia_matrix((data, offsets), shape=(5, 5)) 

In [31]: a.A 
Out[31]: 
array([[ 1, 7, 0, 0, 0], 
     [11, 2, 8, 0, 0], 
     [ 0, 12, 3, 9, 0], 
     [ 0, 0, 13, 4, 10], 
     [ 0, 0, 0, 14, 5]]) 

你舉的例子可以如下重寫。可以使用scipy.sparse.diags來創建矩陣。如果您已經有能夠生成「正確」大小的對角線的代碼,這很有用。使用diags,您不必創建矩形data矩陣。例如,

In [104]: from scipy.sparse import diags 

In [105]: d0 = ones(n) 

In [106]: dp1 = np.ones(N - 1) 

In [107]: dm1 = np.ones(N - 1) 

In [108]: d = [d0, dp1, dm1] 

In [109]: B = diags(d, offsets, dtype=float) 

In [110]: B.A 
Out[110]: 
array([[ 1., 1., 0., 0., 0.], 
     [ 1., 1., 1., 0., 0.], 
     [ 0., 1., 1., 1., 0.], 
     [ 0., 0., 1., 1., 1.], 
     [ 0., 0., 0., 1., 1.]])