Как я могу создать диагональную матрицу с NumPy? - PullRequest
0 голосов
/ 27 сентября 2019

Я не хочу изменять существующий массив, я хочу создать новый массив.В частности, моя матрица должна быть:

-2  1  0 0 0 0 ... 0
 1 -2  1 0 0 0 ... 0
 0  1 -2 1 0 0 ... 0
...
 0  ..........1 -2 1
 0  ..........0 1 -2

Я начинаю с:

        self.A = np.array([-2, 1])

, затем пытаюсь объединить 98 нулей, но, похоже, это не лучший способ.Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 28 сентября 2019

Использование diag для создания диагональной матрицы:

In [140]: np.diag(np.full(5,-2))                                                
Out[140]: 
array([[-2,  0,  0,  0,  0],
       [ 0, -2,  0,  0,  0],
       [ 0,  0, -2,  0,  0],
       [ 0,  0,  0, -2,  0],
       [ 0,  0,  0,  0, -2]])
In [141]: np.diag(np.ones(4),1)                                                 
Out[141]: 
array([[0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.],
       [0., 0., 0., 0., 0.]])
In [142]: np.diag(np.full(5,-2))+np.diag(np.ones(4),1)+np.diag(np.ones(4),-1)   
Out[142]: 
array([[-2.,  1.,  0.,  0.,  0.],
       [ 1., -2.,  1.,  0.,  0.],
       [ 0.,  1., -2.,  1.,  0.],
       [ 0.,  0.,  1., -2.,  1.],
       [ 0.,  0.,  0.,  1., -2.]])

scipy.sparse имеет методы установки нескольких диагоналей одновременно:

In [143]: from scipy import sparse                                              
In [144]: sparse.diags?                                                         
In [145]: sparse.diags([np.full(5,-2),np.ones(4),np.ones(4)],[0,-1,1])          
Out[145]: 
<5x5 sparse matrix of type '<class 'numpy.float64'>'
    with 13 stored elements (3 diagonals) in DIAgonal format>
In [147]: sparse.diags([np.full(5,-2),np.ones(4),np.ones(4)],[0,-1,1]).A        
Out[147]: 
array([[-2.,  1.,  0.,  0.,  0.],
       [ 1., -2.,  1.,  0.,  0.],
       [ 0.,  1., -2.,  1.,  0.],
       [ 0.,  0.,  1., -2.,  1.],
       [ 0.,  0.,  0.,  1., -2.]])

Я мог бы использовать np.ones(4, dtype=int) дляоставьте массив целочисленным dtype.

In [148]: A = np.zeros((5,5),int)                                               
In [149]: A[range(5),range(5)]=-2                                               
In [150]: A[range(4),range(1,5)]=1                                              
In [151]: A[range(1,5),range(4)]=1                                              
In [152]: A                                                                     
Out[152]: 
array([[-2,  1,  0,  0,  0],
       [ 1, -2,  1,  0,  0],
       [ 0,  1, -2,  1,  0],
       [ 0,  0,  1, -2,  1],
       [ 0,  0,  0,  1, -2]])

Или используйте итератор flat, который np.diag использует:

In [163]: A = np.zeros((5,5),int)                                               
In [164]: A.flat[0::6] = -2                                                     
In [165]: A.flat[1::6] = 1                                                      
In [166]: A.flat[5::6] = 1                                                      
In [167]: A                                                                     
Out[167]: 
array([[-2,  1,  0,  0,  0],
       [ 1, -2,  1,  0,  0],
       [ 0,  1, -2,  1,  0],
       [ 0,  0,  1, -2,  1],
       [ 0,  0,  0,  1, -2]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...