繁体   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