簡體   English   中英

用於生成主對角線上方1的對角矩陣的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM