小智 25
使用"常规"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)
Run Code Online (Sandbox Code Playgroud)
您还可以通过花式索引使用"常规"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
Run Code Online (Sandbox Code Playgroud)
(你可以取代那些调用np.arange
与np.r_
如果你想成为更简洁.而不是如data[np.arange(3)+4, np.arange(3)]
使用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]]
Run Code Online (Sandbox Code Playgroud)
但是,如果您打算使用稀疏矩阵,请查看scipy.sparse.spdiags
.(请注意,您必须在前面加上假数据到您的行值,如果你将数据放入一个对角线位置的正值(例如3点的位置4中的例子))
作为一个简单的例子:
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()
Run Code Online (Sandbox Code Playgroud)
这会产生:
[[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]]
Run Code Online (Sandbox Code Playgroud)
@TheCorwoodRep的回答实际上可以在一行中完成。不需要单独的功能。
np.eye(3,3,k=-1) + np.eye(3,3)*2 + np.eye(3,3,k=1)*3
Run Code Online (Sandbox Code Playgroud)
这产生:
array([[ 2., 3., 0.],
[ 1., 2., 3.],
[ 0., 1., 2.]])
Run Code Online (Sandbox Code Playgroud)
小智 6
使用该功能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()
Run Code Online (Sandbox Code Playgroud)
返回:
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.]])
Run Code Online (Sandbox Code Playgroud)
由于三对角矩阵是一个稀疏矩阵,使用稀疏包可能是一个不错的选择,请参阅http://pysparse.sourceforge.net/spmatrix.html#matlab-implementation,其中有一些示例以及与 MATLAB 的比较,甚至...