为了账号安全,请及时绑定邮箱和手机立即绑定

从对列表中制作 Numpy 对称矩阵

从对列表中制作 Numpy 对称矩阵

元芳怎么了 2022-10-11 10:30:51
我有一个相关矩阵,但指定为对,例如:cm = pd.DataFrame({'name1': ['A', 'A', 'B'],                    'name2': ['B', 'C', 'C'],                    'corr': [0.1, 0.2, 0.3]})cm    name1   name2   corr0   A       B       0.11   A       C       0.22   B       C       0.3将其转换为 numpy 二维数组相关矩阵的最简单方法是什么?    A   B   CA 1.0 0.1 0.2B 0.1 1.0 0.3C 0.2 0.3 1.0
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

不确定,pure numpy因为您正在处理熊猫数据框。这是一个纯粹的熊猫解决方案:


s = cm.pivot(*cm)


ret = s.add(s.T, fill_value=0).fillna(1)

输出:


     A    B    C

A  1.0  0.1  0.2

B  0.1  1.0  0.3

C  0.2  0.3  1.0

额外:反向(ret如上)


(ret.where(np.triu(np.ones(ret.shape, dtype=bool),1))

    .stack()

    .reset_index(name='corr')

)

输出:


  level_0 level_1  corr

0       A       B   0.1

1       A       C   0.2

2       B       C   0.3

import networkx as nx

G = nx.from_pandas_edgelist(cm.rename(columns={'corr':'weight'}), 

                            source='name1', 

                            target='name2', 

                            edge_attr ='weight')


G.edges(data=True)

# EdgeDataView([('A', 'B', {'weight': 0.1}), ('A', 'C', {'weight': 0.2}), 

#               ('B', 'C', {'weight': 0.3})])


adj = nx.to_pandas_adjacency(G)

# sets the diagonal to 1 (node can't be connected to itself)

adj[:] = adj.values + np.eye(adj.shape[0])

print(adj)


    A    B    C

A  1.0  0.1  0.2

B  0.1  1.0  0.3

C  0.2  0.3  1.0


查看完整回答
反对 回复 2022-10-11
?
郎朗坤

TA贡献1921条经验 获得超9个赞

一种方法是使用 构建图networkX,将corr列设置为边,并使用weight获取邻接矩阵nx.to_pandas_adjacency



查看完整回答
反对 回复 2022-10-11
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

鉴于最后一列以适当的方式排序,我们可以使用以下代码。


import pandas as pd

import numpy as np


# define data frame

data = pd.DataFrame({

    'name1': ['A', 'A', 'B'],

    'name2': ['B', 'C', 'C'],

    'correlation': [0.1, 0.2, 0.3]})


# get correlation column and dimension

correlation = data['correlation'].values

dimension = correlation.shape[0]


# define empty matrix to fill and unit matrix

matrix_upper_triangular = np.zeros((dimension, dimension))


# fill upper triangular matrix with one half at diagonal

counter = 0

for (row, column), element in np.ndenumerate(matrix_upper_triangular):

    # half of diagonal terms

    if row == column:

        matrix_upper_triangular[row, column] = 0.5

    # upper triangular values

    elif row < column:

        matrix_upper_triangular[row, column] = correlation[counter]

        counter = counter + 1

    else:

        pass


# add upper triangular + lower triangular matrix

correlation_matrix = matrix_upper_triangular

correlation_matrix += matrix_upper_triangular.transpose()


查看完整回答
反对 回复 2022-10-11
  • 3 回答
  • 0 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号