2014-04-29 5 views
1

exécuter ce codeexemple Python pour 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) 

Je reçois l'erreur suivante:

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: la fixation d'un élément de tableau avec une séquence.

Je ne peux pas comprendre ce que je fais mal! Quelqu'un peut-il me donner un exemple correct pour faire ce que j'essaie de faire?

Répondre

4

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.]])