在python矩阵中复制上三角形到下三角形


       iluropoda_melanoleuca  bos_taurus  callithrix_jacchus  canis_familiaris
ailuropoda_melanoleuca     0        84.6                97.4                44
bos_taurus                 0           0                97.4              84.6
callithrix_jacchus         0           0                   0              97.4
canis_familiaris           0           0                   0                 0

这是我的python矩阵的一个简短版本。我在上面的三角形中得到了信息。有没有一个简单的函数可以把矩阵的上三角形复制到下三角形?

要在NumPy中做到这一点,不使用双循环,您可以使用tril_indices。请注意,根据您的矩阵大小,这可能比添加转置并减去对角线要慢,尽管这种方法可能更具可读性。

>>> i_lower = np.tril_indices(n, -1)
>>> matrix[i_lower] = matrix.T[i_lower]  # make the matrix symmetric

请注意,不要将tril_indicestriu_indices混合使用,因为它们都使用行主索引,也就是说,这不起作用:

>>> i_upper = np.triu_indices(n, 1)
>>> i_lower = np.tril_indices(n, -1)
>>> matrix[i_lower] = matrix[i_upper]  # make the matrix symmetric
>>> np.allclose(matrix.T, matrix)
False

对于NumPy数组,最简单和最快的(无循环)方法如下:

对于100x100矩阵,与可接受的答案相比,以下速度快了约3倍,对于10x10矩阵,速度大致相同。

import numpy as np
X= np.array([[0., 2., 3.],
             [0., 0., 6.],
             [0., 0., 0.]])
X = X + X.T - np.diag(np.diag(X))
print(X)
#array([[0., 2., 3.],
#       [2., 0., 6.],
#       [3., 6., 0.]])

注意,这个矩阵要么一开始就必须是上三角形,要么按照下面的方法使它成为上三角形。

rng = np.random.RandomState(123)
X = rng.randomint(10, size=(3, 3))
print(X)
#array([[2, 2, 6],
#       [1, 3, 9],
#       [6, 1, 0]])
X = np.triu(X)
X = X + X.T - np.diag(np.diag(X))
print(X)
#array([[2, 2, 6],
#       [2, 3, 9],
#       [6, 9, 0]])

如果我正确理解了这个问题,我相信这是可行的

for i in range(num_rows):
    for j in range(i, num_cols):
        matrix[j][i] = matrix[i][j]

我想这里有一个更好的:

>>> a = np.arange(16).reshape(4, 4)
>>> print(a)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
>>> iu = np.triu_indices(4,1)
>>> il = (iu[1],iu[0])
>>> a[il]=a[iu]
>>> a
    array([[ 0,  1,  2,  3],
           [ 1,  5,  6,  7],
           [ 2,  6, 10, 11],
           [ 3,  7, 11, 15]])

如果U是上三角矩阵,可以使用triu和转置使其对称:

LDU = triu(U,1)+U.T
def inmatrix(m,n):#input Matrix Function 
    a=[]
    for i in range(m):
        b=[]
        for j in range(n):
            elm=int(input("Enter number in Pocket ["+str(i)+"]["+str(j)+"] "))
            b.append(elm)
        a.append(b)
    return  a
def Matrix(a):#print Matrix Function
    for i in range(len(a)):
        for j in range(len(a[0])):
            print(a[i][j],end=" ")
        print()
m=int(input("Enter number of row "))
n=int(input("Enter number of column"))
a=inmatrix(m,n) #call input Matrix function
Matrix(a)#print Matrix 
t=[]#create Blank list 
for i in range(m):
    for j in range(n):
        if i>j:#check upper triangular Elements 
            t.append(a[i][j])#add them in a list 
k=0#variable for list 
for i in range(m):
    for j in range(n):
        if i<j:
            a[i][j]=t[k]copy list item to lower triangular 
            k=k+1
Matrix(a)# print Matrix after change 

最新更新