Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将python矩阵中的上三角形复制到下三角形_Python_Matrix - Fatal编程技术网

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

将python矩阵中的上三角形复制到下三角形,python,matrix,Python,Matrix,这是我的python矩阵的一个简短版本。我有上面三角形的信息。是否有一个简单的函数可以将矩阵的上三角复制到下三角?如果我正确理解了这个问题,我相信这会起作用 iluropoda_melanoleuca bos_taurus callithrix_jacchus canis_familiaris ailuropoda_melanoleuca 0 84.6 97.4 44 bos_taurus

这是我的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

要在NumPy中执行此操作,而不使用双循环,可以使用。请注意,根据矩阵大小,这可能会慢一些,尽管此方法更具可读性

for i in range(num_rows):
    for j in range(i, num_cols):
        matrix[j][i] = matrix[i][j]
注意不要尝试混合
tril_索引
,因为它们都使用行主索引,也就是说,这不起作用:

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

我想这里有一个更好的:

>>> 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阵列执行此操作的最简单、最快速(无循环)方法如下: 与10x10矩阵相比,100x100矩阵的以下速度快约3倍,且大致相同

>>> 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]])
请注意,矩阵必须是上三角形才能开始,或者它应该是上三角形,如下所示

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



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

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]])
def inmatrix(m,n):#输入矩阵函数
a=[]
对于范围内的i(m):
b=[]
对于范围(n)内的j:
elm=int(输入(“在口袋中输入数字[“+str(i)+”][“+str(j)+”]”)
b、 附加(elm)
a、 附加(b)
归还
def矩阵(a):#打印矩阵函数
对于范围内的i(len(a)):
对于范围内的j(len(a[0]):
打印(a[i][j],end=”“)
打印()
m=int(输入(“输入行数”))
n=int(输入(“输入列数”))
a=inmatrix(m,n)#调用输入矩阵函数
矩阵(a)#打印矩阵
t=[]#创建空白列表
对于范围内的i(m):
对于范围(n)内的j:
如果i>j:#检查上三角元素
t、 附加(a[i][j])#将它们添加到列表中
k=0#列表变量
对于范围内的i(m):
对于范围(n)内的j:

如果是iYes,这对大型矩阵有效且速度更快。对于100x100,我的速度要快3到4倍,但10x10的速度是相同的。一个重要的警告是,只有当矩阵的下半部分全部为零时(如OP的问题中所述),这才有效。如果由于某种原因,下半部分并非全为零,则在添加转置和减去对角线后退之前,您需要包含
X=np.triu(X)
,在这种情况下,10x10的速度要慢约2倍,但100x100的速度要快约1.5倍。您好@seralouk,如果您能在此线程中提供一些建议,我们将不胜感激:
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