用于将两个模式矩阵数据转换为单模式的Python代码

时间:2014-09-08 13:34:19

标签: python social-networking

作为Python的新手,我想知道是否有可能使用Python代码将两种模式矩阵数据转换为一种模式。

这是为社交网络分析创建数据,我正在寻找一种方法来使用Pandas和Python来创建这样的脚本。

如果我有两个模式数据,请

     workshop1     workshop2     workshop3    workshop4

A 1 0 1 1

B 0 1 1 0

C 1 1 1 0

D 0 0 0 1

我需要将其转换为这样的一种模式矩阵。

           A        B        C          D

A 4 1 2 1

B 1 4 2 0

C 2 2 4 0

D 1 0 0 4

A,B,C,D是注册研讨会的人员的姓名,“1”表示报名参加研讨会的特定人员。

单模式矩阵数据表明他们应该在研讨会上相互见面的次数。例如,A和C预计将在研讨会1和研讨会3上举行两次会议。

提前感谢您的任何建议或帮助!

1 个答案:

答案 0 :(得分:0)

NumPy解决方案:

根据this tutorial,您可以简单地将矩阵与其转置相乘。使用NumPy函数dot()transpose()(或简称T),您最终得到以下代码:

import numpy as np

M = np.array([
    [1,0,1,1],
    [0,1,1,0],
    [1,1,1,0],
    [0,0,0,1]])

print M.dot(M.T)

输出:

[[3 1 2 1]
 [1 2 2 0]
 [2 2 3 0]
 [1 0 0 1]]

根据您的要求,只有对角线不是4。相比之下,它们包含了一个人参加的研讨会的数量。您可以使用np.fill_diagonal(A, 4)轻松解决该问题,A是单模式矩阵。

No-NumPy解决方案:

如果您不想使用NumPy,可以将standard matrix multiplication调整为“R = M * M ^ T”的特殊情况:

m = len(M)
n = len(M[0])
R = [[0 for i in range(m)] for j in range(m)]
for i in range(m):
    for j in range(m):
        for k in range(n):
            R[i][j] += M[i][k] * M[j][k]

或包含3个索引的相应单行ijk

R = [[sum(M[i][k] * M[j][k] for k in range(len(M[0]))) for i in range(len(M))] for j in range(len(M))]

或者直接迭代M行:

R = [[sum(a * b for a, b in zip(A, B)) for B in M] for A in M]