2012-04-24 3 views
3

Я пытаюсь создать разреженную матрицу, которая имеет двумерный узор, проходящий по диагонали. Это, вероятно, проще всего объяснить с помощью быстрого примера.Как создать диагональную разреженную матрицу в SciPy

Say мой паттерн: [1,0,2,0,1] ...

Я хочу создать разреженную матрицу:

[[2,0,1,0,0,0,0...0], 
    [0,2,0,1,0,0,0...0], 
    [1,0,2,0,1,0,0...0], 
    [0,1,0,2,0,1,0...0], 
    [0,0,1,0,2,0,1...0], 
    [...]] 

scipy.sparse.dia_matrix походит хороший кандидат, однако, я просто не могу понять, как выполнить то, что я хочу из доступной документации. Спасибо заранее

ответ

6
N = 10 
diag = np.zeros(N) + 2 
udiag = np.zeros(N) + 1 
ldiag = np.zeros(N) + 1 
mat = scipy.sparse.dia_matrix(([diag, udiag, ldiag], [0, 2, -2]), shape=(N, N)) 
print mat.todense() 
[[ 2. 0. 1. 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 2. 0. 1. 0. 0. 0. 0. 0. 0.] 
[ 1. 0. 2. 0. 1. 0. 0. 0. 0. 0.] 
[ 0. 1. 0. 2. 0. 1. 0. 0. 0. 0.] 
[ 0. 0. 1. 0. 2. 0. 1. 0. 0. 0.] 
[ 0. 0. 0. 1. 0. 2. 0. 1. 0. 0.] 
[ 0. 0. 0. 0. 1. 0. 2. 0. 1. 0.] 
[ 0. 0. 0. 0. 0. 1. 0. 2. 0. 1.] 
[ 0. 0. 0. 0. 0. 0. 1. 0. 2. 0.] 
[ 0. 0. 0. 0. 0. 0. 0. 1. 0. 2.]] 
+0

Вместо 'np.zeros (N) + 1', это может быть clearer сделать 'np.ones (N)'. :) – Dougal

+2

:) Причина, по которой это np.zeros (N) +1, потому что возможно, что автор захочет иметь там какое-то другое значение (скажем, 100), а затем код будет тем же np.zeros (N) +100. Но, очевидно, это вопрос стиля. –

+0

Действительно, мне нужны значения, отличные от одних и двух. Спасибо! Болезненно, насколько очевидно это решение, я просто не понял конструктор dia_matrix. – user1354372

0
In [27]: N = 5 

In [28]: diagonalvals = [7, 8, 9] 

In [29]: offsets = [-2, 0, 2] 

In [30]: diagonaldata = [[v for n in range(N)] for v in diagonalvals] 

In [31]: print diagonaldata 
[[7, 7, 7, 7, 7], [8, 8, 8, 8, 8], [9, 9, 9, 9, 9]] 

In [32]: A = scipy.sparse.dia_matrix((diagonaldata, offsets), shape=(N, N)) 

In [33]: print A 
    (2, 0) 7 
    (3, 1) 7 
    (4, 2) 7 
    (0, 0) 8 
    (1, 1) 8 
    (2, 2) 8 
    (3, 3) 8 
    (4, 4) 8 
    (0, 2) 9 
    (1, 3) 9 
    (2, 4) 9 
1

Вот забавный способ создать список списков вроде этого:

>>> n = 7 
>>> a = n*[0] + [1, 0, 2, 0, 1] + [0]*n 
>>> [a[-i+n+2:-i+2*n+2] for i in xrange(n)] 
[[2, 0, 1, 0, 0, 0, 0], 
[0, 2, 0, 1, 0, 0, 0], 
[1, 0, 2, 0, 1, 0, 0], 
[0, 1, 0, 2, 0, 1, 0], 
[0, 0, 1, 0, 2, 0, 1], 
[0, 0, 0, 1, 0, 2, 0], 
[0, 0, 0, 0, 1, 0, 2]] 
Смежные вопросы