Python 从对列表中生成Numpy对称矩阵

Python 从对列表中生成Numpy对称矩阵,python,numpy,matrix,Python,Numpy,Matrix,我有一个相关矩阵,但指定为成对,如: cm=pd.DataFrame({'name1':['A','A','B'], '名称2':['B','C','C'], “corr”:[0.1,0.2,0.3]}) 厘米 名称1名称2更正 0 A B 0.1 1 A C 0.2 2 B C 0.3 将其转换为numpy 2d阵列相关矩阵的最简单方法是什么 A B C A 1.0 0.1 0.2 B 0.1 1.0 0.3 C 0.2 0.3 1.0 一种方法是使用networkX构建图

我有一个相关矩阵,但指定为成对,如:

cm=pd.DataFrame({'name1':['A','A','B'],
'名称2':['B','C','C'],
“corr”:[0.1,0.2,0.3]})
厘米
名称1名称2更正
0 A B 0.1
1 A C 0.2
2 B C 0.3
将其转换为numpy 2d阵列相关矩阵的最简单方法是什么

    A   B   C
A 1.0 0.1 0.2
B 0.1 1.0 0.3
C 0.2 0.3 1.0

一种方法是使用
networkX
构建图形,将
corr
列设置为edge
weight
,并使用以下方法获取图形:



因为您正在处理一个数据帧,所以不能确定纯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
  level_0 level_1  corr
0       A       B   0.1
1       A       C   0.2
2       B       C   0.3

Extra:用于反向(
ret
如上所述)

输出:

     A    B    C
A  1.0  0.1  0.2
B  0.1  1.0  0.3
C  0.2  0.3  1.0
  level_0 level_1  corr
0       A       B   0.1
1       A       C   0.2
2       B       C   0.3

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

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()
将熊猫作为pd导入
将numpy作为np导入
#定义数据帧
data=pd.DataFrame({
'名称1':['A','A','B'],
'名称2':['B','C','C'],
“相关性”:[0.1,0.2,0.3]})
#获取相关列和维度
相关性=数据['correlation']。值
维度=相关性。形状[0]
#定义要填充的空矩阵和单位矩阵
矩阵_上_三角形=np.零((维数,维数))
#在对角线处用一半填充上三角矩阵
计数器=0
对于(行、列),np.ndenumerate中的元素(矩阵\u上部\u三角形):
#对角项的一半
如果行==列:
矩阵_上部_三角形[行、列]=0.5
#上三角值
elif行<列:
矩阵上三角[行,列]=相关[计数器]
计数器=计数器+1
其他:
通过
#添加上三角+下三角矩阵
相关矩阵=矩阵上三角
相关矩阵+=矩阵上三角转置()

非常聪明而且很好的解决方案!让我们看看是否可以使用纯numpy,但这肯定是一种可能性。非常优雅的解决方案!你能解释一下cm.pivot(*cm)的作用吗?@MachineLearner
*cm
本质上等同于
*list(cm.column)
。因此,在本例中,该行相当于
cm.pivot('name1','name2','corr')
。反过来是什么?如何使用
melt
s
返回到
cm
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()