自定义显示上三角矩阵?

时间:2017-01-31 18:03:43

标签: python numpy matrix

我有一个6乘6的矩阵,我想显示没有对角元素的上三角矩阵:

我做了什么:

Rand_num = np.random.rand(6,6)
for i in range(0,6):
        for j in range(1,6):
                print Rand_num[i][j]

在我看来,算法应该是:

for row = 1 to 6
    for col = (row+1) to 6
           print Rand_num[row][col]

我怎样才能使用Python?

问题归结为我的任务是用另一个列表中的元素填充矩阵: 例如,有一个包含15个元素的Tmpelem列表,我希望它们按顺序分配给一个新矩阵(6乘6),它们创建一个没有对角元素的三角矩阵。

2 个答案:

答案 0 :(得分:2)

假设您使用NumPy就像创建矩阵一样好,只需使用numpy.triu

In[126]: samp = np.random.rand(3, 3)

In[127]: np.triu(samp, k=1)
Out[127]: 
array([[ 0.        ,  0.77524531,  0.16391846],
       [ 0.        ,  0.        ,  0.12625853],
       [ 0.        ,  0.        ,  0.        ]])

k表示下面的对角线,其余部分应归零。

根据您的编辑,如果您打算使用值列表修改某些现有矩阵的上三角区域,您可以使用numpy.triu_indices来获取正确的索引,这里使用(4,1)表示4×4矩阵和主要上方的一个对角线。

In[142]: matr = np.arange(1, 17).reshape(4,4)

In[143]: matr
Out[143]: 
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])

In[144]: matr[np.triu_indices(4, 1)] = np.arange(100, 106)

In[145]: matr
Out[145]: 
array([[  1, 100, 101, 102],
       [  5,   6, 103, 104],
       [  9,  10,  11, 105],
       [ 13,  14,  15,  16]])

答案 1 :(得分:-1)

有意义的是numpy有一个np.triu_indices,如Mitch所示

但循环也可以正常工作

A=np.zeros((6,6))

A
Out[31]: 
array([[ 0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.]])

ulst = [i for i in range(1,16)]

ulst
Out[33]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

ulst_gen = (i for i in ulst)

for i in range(6):
    for j in range(6):
        if j > i:
            A[i,j] = next(ulst_gen)

A
Out[36]: 
array([[  0.,   1.,   2.,   3.,   4.,   5.],
       [  0.,   0.,   6.,   7.,   8.,   9.],
       [  0.,   0.,   0.,  10.,  11.,  12.],
       [  0.,   0.,   0.,   0.,  13.,  14.],
       [  0.,   0.,   0.,   0.,   0.,  15.],
       [  0.,   0.,   0.,   0.,   0.,   0.]])