當dia_matrix
的第一個參數的形式(data, offsets)
,data
預計將有2 d陣列,其中的每data
列保持一個對角矩陣的。由於data
是矩形矩陣,因此忽略data
中的一些元素。子對角線「左對齊」,超對角線「右對齊」。 (具體而言,和稀疏矩陣A
data
之間的映射是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.]])