Python构建numpy矩阵
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python构建numpy矩阵相关的知识,希望对你有一定的参考价值。
我得到了这个矩阵,我正在尝试编写一个函数来为任意大小的n构建这个矩阵。我被告知矩阵的高度是n
,但不确定宽度。
下面是我的代码和输出,这是正确的吗?我对矩阵本身的符号感到有些困惑。
def buildMatrix(n, a):
matrix = np.zeros([n, n], dtype=float)
x_diag, y_diag = np.diag_indices_from(matrix)
for (x,y) in zip(x_diag, y_diag):
if x > (n / 2):
matrix[x][y] = -2*a
elif x == (n / 2):
matrix[x][y] = -(1 + a)
else:
matrix[x][y] = -2
if x != n - 1:
matrix[x + 1][y] = a if x >= (n / 2) else 1
matrix[x][y + 1] = a if x >= (n / 2) else 1
return matrix
用buildMatrix(5, 2)
输出
[[-2. 1. 0. 0. 0.]
[ 1. -2. 1. 0. 0.]
[ 0. 1. -3. 2. 0.]
[ 0. 0. 2. -4. 2.]
[ 0. 0. 0. 2. -4.]]
谁能帮我吗?
答案
要回答您的第一个问题,矩阵必须具有n
的宽度,以使矩阵向量乘积兼容。
矩阵的图像在从-2到 - (1-a)到-2a的切换发生的位置是不明确的。在您的代码中,检查x==n/2
是否设置开关。这在python2中没问题但是会在python3中引起问题,因为x / 2返回2.5。使用更安全的x==n//2
,因为n // 2在python2和python3中返回一个整数。
一般来说,我将假设切换发生在第m行。使用切片和np.diag命令可以更轻松地构建矩阵。
def buildmat(n, m, a):
diag = np.zeros(n)
offdiag = np.zeros(n-1)
offdiag[0:m] = 1
offdiag[m:n-1] = a
diag[0:m] = -2
diag[m] = -(1+a)
diag[m+1:n] = -2*a
matrix = np.diag(diag) + np.diag(offdiag, 1) + np.diag(offdiag, -1)
return matrix
运行
buildmat(5, 2, 3)
产生
[[-2. 1. 0. 0. 0.]
[ 1. -2. 1. 0. 0.]
[ 0. 1. -3. 2. 0.]
[ 0. 0. 2. -4. 2.]
[ 0. 0. 0. 2. -4.]]
以上是关于Python构建numpy矩阵的主要内容,如果未能解决你的问题,请参考以下文章