用于生成主对角线上方1的对角矩阵的Python代码

时间:2016-03-27 13:02:34

标签: python numpy

我想编写一个python函数,它生成一个大小为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。

我陷入困境,我认为我的代码是正确的,并且不知道错误在哪里。我该如何解决?有人可以帮忙吗?

感谢。

3 个答案:

答案 0 :(得分:8)

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.]]) )对角线的偏移量。它给出了:

$screenWidth=$(this).width();

function checkWindowWidth() {
 if($screenWidth<767){
 }

 if(991>$screenWidth && $screenWidth>768){
    $('.number',.number+span).css('width','100%');
 }

 if($screenWidth<1199 && $screenWidth>992){
    $('.number,.number+span').css('width','45%');
 }

 if($screenWidth>1199){
    $('.number,.number+span').css('width','33%');   
 }
}

答案 1 :(得分:4)

你想要的只是一个对角线,还是整个上三角?

有一组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]])

答案 2 :(得分:2)

您在每次迭代时将矩阵重置为零。将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使用np.diag(np.ones(n-1),1)内置^('[^']*')(=>)('[^']*')$