亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從對列表中制作 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 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號