![](/img/trans.png)
[英]How to construct diagonal above the main diagonal using numpy and python?
[英]Python code to produce diagonal matrix with 1 above the main diagonal
我想編寫一個python函數,它生成一個大小為n乘以n的零矩陣,對於主對角線上方的所有元素都有1。
這是我的代碼:
def funtest(n):
for i in range(0,n-2):
s = (n,n)
Y = zeros(s)
Z = Y
Z[i,i+1]=1
return Z
但結果只在矩陣的(n-1,n-2)元素中給出1。
我被卡住了,我真的認為我的代碼是正確的,並且不知道錯誤在哪里。 我該如何解決? 有人可以幫忙嗎?
謝謝。
numpy.diag
函數可以這樣做:
import numpy as np
print( np.diag(np.ones(4), 1) )
使用第二個參數( 1
)對角線的偏移量。 它給:
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.]])
你想要的只是一個對角線,還是整個上三角?
有一組np.tri*
函數用於索引和創建上三角和下三角數組:
In [395]: np.triu(np.ones((5,5),int),1)
Out[395]:
array([[0, 1, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]])
我甚至可以用兩個tri
調用創建一個對角線
In [399]: np.tril(np.triu(np.ones((5,5),int),1),1)
Out[399]:
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]])
不是我建議通過np.diag
函數。 :)
要么
In [404]: np.diagflat(np.ones(4,int),1)
Out[404]:
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]])
您在每次迭代時將矩陣重置為零。 在循環外移動zeros
調用,它工作正常:
def funtest(n):
s = (n,n)
Y = zeros(s)
for i in range(0,n-1):
Y[i,i+1]=1
return Y
請注意,您還需要循環到n-1,而不是n-2(向上移動行只會將1的數量減少1!)。 以下是上述固定功能的輸出:
funtest(5)
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.]])
這與您的方法匹配,但也可以使用numpy
builtin np.diag(np.ones(n-1),1)
查看Swier的答案 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.