【问题标题】:Custom display of upper triangular matrix? [duplicate]自定义显示上三角矩阵? [复制]
【发布时间】:2017-02-01 02:50:52
【问题描述】:

我有一个 6 x 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 x 6),以便他们创建一个没有对角元素的三角矩阵。

【问题讨论】:

    标签: python numpy matrix


    【解决方案1】:

    假设您可以像创建矩阵一样使用 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 来获取正确的索引,这里使用@987654327 @ 表示 4 x 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]])
    

    【讨论】:

    • 太棒了!比你这么多帮助我!
    【解决方案2】:

    numpy 有一个如 Mitch 所示的 np.triu_indices 是有道理的

    但循环也可以工作

    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.]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 2013-05-02
      • 2017-06-17
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多