作为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上举行两次会议。
提前感谢您的任何建议或帮助!
答案 0 :(得分:0)
根据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
是单模式矩阵。
如果您不想使用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个索引的相应单行i
,j
和k
:
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]