2015-10-26 5 views
1

Я хочу, чтобы записи диагонали матрицы А были действительными числами c>1 такими, что a_ii=c^(i+1), т. Е. От меньшей до большей мощности, так как мы пройти через диагональ.Python, lil_matrix: установить диагональ как числовое число

Моя матрица представляет собой квадратную матрицу размером 10x10.

from scipy.sparse import lil_matrix 
A = lil_matrix((10, 10)) 

Я думал об использовании функции A.setdiag, но я не могу понять, как ввести зависимость от i.

+0

отметить, что '' х^y'' в Python является двоичный XOR, не возведение в степень. Экспоненциальность - '' x ** y''. – jakevdp

+0

Конечно, я перепутался! Благодаря ! – ALM

ответ

0

Вы можете использовать A.setdiag:

import numpy as np 
import scipy.sparse as sparse 
N = 5 
c = 1.1 
A = sparse.lil_matrix((N, N)) 
A.setdiag(c**np.arange(1, N+1)) 
print(A.todense()) 

дает

[[ 1.1  0.  0.  0.  0.  ] 
[ 0.  1.21  0.  0.  0.  ] 
[ 0.  0.  1.331 0.  0.  ] 
[ 0.  0.  0.  1.4641 0.  ] 
[ 0.  0.  0.  0.  1.61051]] 

NumPy выполняет поэлементные арифметические операции над массивами. Поэтому повышение скаляр, c, в массив, np.arange(1, N+1), возвращает новый массив NumPy со значениями c**i для каждого i в np.arange(1, N+1):

In [18]: c, N = 1.1, 5 

In [21]: np.arange(1, N+1) 
Out[21]: array([1, 2, 3, 4, 5]) 

In [22]: c**np.arange(1, N+1) 
Out[22]: array([ 1.1 , 1.21 , 1.331 , 1.4641 , 1.61051]) 
+0

Отличное спасибо! Мне пришлось редактировать и использовать 'A.setdiag (c ** (numpy.arange (10) +1))' , но это именно то, что мне нужно. – ALM

+0

Я использовал 'c ** np.arange (1, N + 1)', спасибо за редактирование! – ALM

Смежные вопросы