numpy:用不同的值填充偏移对角线

时间:2015-05-27 15:51:39

标签: python numpy

我需要制作一个n*n矩阵m,其元素遵循m(i,i+1)=sqrt(i),否则为0。例如,对于n=5,我们应该

[0 a 0 0 0]
[0 0 b 0 0]
[0 0 0 c 0]
[0 0 0 0 d]
[0 0 0 0 0]

其中{a,b,c,d}=sqrt({1,2,3,4})Here是一个常数三对角矩阵的解决方案,但我的情况比这复杂一点。我知道我可以用循环或列表理解来做到这一点,但还有其他方法吗? n可能很大。

e.g。 (列表理解代码)

ele=lambda i,j:sqrt(i+1) if j-i==1 else 0

[[ele(i,j) for j in range(0,6)] for i in range(0,6)]

3 个答案:

答案 0 :(得分:6)

一种方法是创建零数组,然后使用索引来选择并使用平方根值填充所需的索引。

例如:

>>> z = np.zeros((5,5))
>>> rng = np.arange(4)
>>> z[rng, rng+1] = np.sqrt(rng+1)
>>> z
array([[ 0.        ,  1.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  1.41421356,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  1.73205081,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  2.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ]])

答案 1 :(得分:4)

您可以直接使用np.diag

>>> d = np.sqrt(1 + np.arange(4))
>>> np.diag(d, 1)
array([[ 0.        ,  1.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  1.41421356,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  1.73205081,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  2.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ]])

np.diag的第二个参数指定了有问题的对角线。

答案 2 :(得分:2)

显然有点晚了,但是我想在这个问题中引入numpy diagflat方法。可以通过以下方式完成:

       #include <stdio.h>

    struct date
    {
        int year;
        int month;
        int day;
    };
    typedef struct
    {
        char name[30];
        float grade[3];
        struct date birthdate;
    }student;

    int main()
    {
        student list[2];
        int i,j;
        for(i=0;i<2;i++)
        {
            printf("Enter student's name:\n");
            gets(list[i].name);
            printf("Enter student's birthday(y/m/d):\n");
            scanf("%d%d%d",&list[i].birthdate.year,&list[i].birthdate.month,&list[i].birthdate.day);
            for(j=0;j<3;j++)
            {
                printf("Enter student's grades:\n");
                scanf("%f",&list[i].grade[j]);
            }

        }
return 0;
       }