回答
由於三角矩陣是用一個稀疏的包應該是一個不錯的選擇,看http://pysparse.sourceforge.net/spmatrix.html#matlab-implementation,也有一些實例和比較與MATLAB甚至...
你也可以做到這一點稀疏矩陣通過花哨的索引「常規」 numpy的數組:
import numpy as np
data = np.zeros((10,10))
data[np.arange(5), np.arange(5)+2] = [5, 6, 7, 8, 9]
data[np.arange(3)+4, np.arange(3)] = [1, 2, 3]
print data
(你可以用np.r_
如果你想更簡潔替換那些調用np.arange
例如,而不是。,使用data[np.r_[:3]+4, np.r_[:3]]
)
這產生了:
[[0 0 5 0 0 0 0 0 0 0]
[0 0 0 6 0 0 0 0 0 0]
[0 0 0 0 7 0 0 0 0 0]
[0 0 0 0 0 8 0 0 0 0]
[1 0 0 0 0 0 9 0 0 0]
[0 2 0 0 0 0 0 0 0 0]
[0 0 3 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]]
不過,如果你打算無論如何要使用稀疏矩陣,看看scipy.sparse.spdiags
。 (請注意,如果將數據放入具有正值的對角線位置(例如,示例中的位置4處的3位),則需要將前綴假數據拖到您的行值上)
作爲快速例如:
import numpy as np
import scipy as sp
import scipy.sparse
diag_rows = np.array([[1, 1, 1, 1, 1, 1, 1],
[2, 2, 2, 2, 2, 2, 2],
[0, 0, 0, 0, 3, 3, 3]])
positions = [-3, 0, 4]
print sp.sparse.spdiags(diag_rows, positions, 10, 10).todense()
這產生了:
[[2 0 0 0 3 0 0 0 0 0]
[0 2 0 0 0 3 0 0 0 0]
[0 0 2 0 0 0 3 0 0 0]
[1 0 0 2 0 0 0 0 0 0]
[0 1 0 0 2 0 0 0 0 0]
[0 0 1 0 0 2 0 0 0 0]
[0 0 0 1 0 0 2 0 0 0]
[0 0 0 0 1 0 0 0 0 0]
[0 0 0 0 0 1 0 0 0 0]
[0 0 0 0 0 0 1 0 0 0]]
謝謝你們! – 2011-05-02 16:03:06
用 「常規」 numpy的陣列,使用numpy.diag:
def tridiag(a, b, c, k1=-1, k2=0, k3=1):
return np.diag(a, k1) + np.diag(b, k2) + np.diag(c, k3)
a = [1, 1]; b = [2, 2, 2]; c = [3, 3]
A = tridiag(a, b, c)
我的答案建立@ TheCorwoodRep的答案。我只是發佈它,因爲我做了一些更改,使它更加模塊化,以便它可以用於不同的矩陣順序,並且還可以更改,k2
,k3
的值,即決定對角線出現的位置,將處理自動溢出。在調用函數時,您可以指定對角線上應顯示的值。
import numpy as np
def tridiag(T,x,y,z,k1=-1, k2=0, k3=1):
a = [x]*(T-abs(k1)); b = [y]*(T-abs(k2)); c = [z]*(T-abs(k3))
return np.diag(a, k1) + np.diag(b, k2) + np.diag(c, k3)
D=tridiag(10,-1,2,-1)
@TheCorwoodRep的答案其實也可以在一個單一的線來完成。不需要單獨的功能。
np.eye(3,3,k=-1) + np.eye(3,3)*2 + np.eye(3,3,k=1)*3
這將產生:
array([[ 2., 3., 0.],
[ 1., 2., 3.],
[ 0., 1., 2.]])
使用功能scipy.sparse.diags
。
例子:
from scipy.sparse import diags
import numpy as np
#
n = 10
k = np.array([np.ones(n-1),-2*np.ones(n),np.ones(n-1)])
offset = [-1,0,1]
A = diags(k,offset).toarray()
這將返回:
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.]])
- 1. 使用scipy.sparse的三角形塊矩陣
- 2. 復對稱三對角矩陣的快速矩陣指數
- 3. maple 13三對角矩陣幫助
- 4. 在matlab中創建塊三對角矩陣
- 5. 三角矩陣乘法代
- 6. Tensorflow中的塊對角矩陣
- 7. 矩陣列表的塊對角線
- 8. 來自列的塊對角矩陣
- 9. 下三角矩陣和上三角矩陣給我的錯誤答案
- 10. Python numpy矩陣乘以一個對角矩陣
- 11. 矩陣的矩陣對角元素
- 12. 提取下三角矩陣,而不考慮對角元素
- 13. Boost C++中的三角對角矩陣類
- 14. 茱莉亞的下三角矩陣
- 15. r逆轉下三角矩陣環
- 16. numpy數組爲三角形(矩陣)
- 17. 有效存儲三角矩陣
- 18. 創建一個三角矩陣
- 19. 線性指數上三角矩陣
- 20. numpy:顛倒上三角矩陣
- 21. 特徵:找到一個三角矩陣
- 22. 如何將塊轉換爲塊對角矩陣(NumPy)
- 23. 計算塊的座標中對角線塊矩陣
- 24. Mathematica矩陣對角化
- 25. 對角線反映矩陣
- 26. 在MATLAB中對上三角矩陣進行一般導入
- 27. 需要確定一個矩陣來對齊兩個三角形
- 28. 擺脫對稱矩陣的上部或下部三角部分
- 29. 如何在MATLAB中創建三對角矩陣?
- 30. 從MATLAB矩陣陣列創建對角線矩陣
你想要的結果是另一個ndarray,或者是你打開使用稀疏數組的結果呢? – talonmies 2011-05-01 08:48:42