首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python中的"i不等于j“循环重新计算对称矩阵的元素

使用Python中的"i不等于j“循环重新计算对称矩阵的元素
EN

Stack Overflow用户
提问于 2020-12-11 04:34:35
回答 1查看 189关注 0票数 0

关联矩阵是一个对称矩阵,这意味着它的上对角元素和下对角元素是彼此的镜像,统称为非对角线元素(与对角线元素相反,在任何相关矩阵中它们都等于1,因为任何变量与自身的相关性仅为1)。

对于变量2和1 (第2行,第1列),在上对角线上交换第I行数和下对角线j‘列数时,相关矩阵的非对角线元素是相同的。因此,我们只需要重新计算下对角元素,然后将它们复制到矩阵的上对角线中相应的位置。

代码语言:javascript
复制
import numpy as np
from numpy.random import randn
X = randn(20,3)
Rho = np.corrcoef(X.T) #correlation matrix
print(np.tril(Rho)) #lower off-diagonal of matrix Rho to re-calculate, then copy to other side

显示

代码语言:javascript
复制
array([[ 1.        ,  0.        ,  0.        ],
       [-0.03003281,  1.        ,  0.        ],
       [-0.02602238,  0.06137713,  1.        ]])

对于以下步骤序列,编写"i不等于- to j“循环的最有效方法是什么:

  1. 根据一些应用函数重新计算对称矩阵的下非对角线元素(为了使其简单,我们只需在这些元素中添加+2 )。
  2. 将相同的计算结果翻转到其镜像(对应的上对角线)上。
  3. 另外,将对称矩阵的对角线元素替换为充满10 s的向量(而不是相关矩阵中的1)。

其目的是生成一个新的矩阵,即重新计算原矩阵。

EN

回答 1

Stack Overflow用户

发布于 2021-01-08 01:02:55

让我们首先生成Rho (注意,我正在初始化伪随机数生成器,以便在不同的代码运行中获得相同的Rho ):

代码语言:javascript
复制
In [526]: import numpy as np

In [527]: np.random.seed(0)
     ...: n = 3
     ...: X = np.random.randn(20, n)
     ...: Rho = np.corrcoef(X.T)

In [528]: Rho
Out[528]: 
array([[1.        , 0.03224462, 0.05021998],
       [0.03224462, 1.        , 0.15140358],
       [0.05021998, 0.15140358, 1.        ]])

然后可以使用NumPy的tril_indices_from高级索引生成新的矩阵:

代码语言:javascript
复制
In [548]: result = np.zeros_like(Rho)

In [549]: lrows, lcols = np.tril_indices_from(Rho, k=-1)

In [550]: result[lrows, lcols] = Rho[lrows, lcols] + 2

In [551]: result
Out[551]: 
array([[0.        , 0.        , 0.        ],
       [2.03224462, 0.        , 0.        ],
       [2.05021998, 2.15140358, 0.        ]])

In [552]: result[lcols, lrows] = result[lrows, lcols]

In [553]: result
Out[553]: 
array([[0.        , 2.03224462, 2.05021998],
       [2.03224462, 0.        , 2.15140358],
       [2.05021998, 2.15140358, 0.        ]])

In [554]: result[np.arange(n), np.arange(n)] = 10

In [555]: result
Out[555]: 
array([[10.        ,  2.03224462,  2.05021998],
       [ 2.03224462, 10.        ,  2.15140358],
       [ 2.05021998,  2.15140358, 10.        ]])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65245837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档