Lorsque le premier argument de dia_matrix
a la forme (data, offsets)
, data
est prévu une matrice 2-D, avec chaque rangée de data
tenant une diagonale de la matrice. Puisque data
est une matrice rectangulaire, certains éléments de data
sont ignorés. Les sous-diagonales sont alignées à gauche et les superdiagonales sont alignées à droite. (En particulier, la mise en correspondance entre data
et la matrice creuse A
est data[i,j] == A[j - offsets[i], j]
). Par exemple, considérons la suivante qui sera utilisée pour créer une matrice 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
contient trois diagonales. Depuis offset[0]
est 0, la ligne 0 de data
contient la diagonale principale. Tous les 5 éléments de cette rangée sont utilisés dans la matrice. offset[1]
est 1, donc les données dans deviennent la première superdiagonal. Seules les valeurs [7, 8, 9, 10]
seront utilisées; la première valeur, 6
, est ignorée. De même, la troisième ligne de data
donne la première sous-diagonale, et seules les valeurs [11, 12, 13, 14]
sont utilisées.
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]])
Votre exemple peut être réécrite comme suit:
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.]])
Le dia_matrix
docstring a un autre exemple.
Vous pouvez également utiliser scipy.sparse.diags
pour créer la matrice. Ceci est utile si vous avez déjà du code qui génère les diagonales de taille "correcte". Avec diags
, vous n'avez pas besoin de créer la matrice rectangulaire data
. Par exemple,
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.]])