作为Python的新手,我想知道是否有任何方法可以使用Python代码将两种模式的矩阵数据转换为一种模式。
这是为社交网络分析创建数据,我正在寻找一种方法来使用Pandas和Python来创建这样的脚本。
如果我有像这样的两种模式数据,
workshop1 workshop2 workshop3 workshop4A 1 0 1 1
B 0 1 1 0
C 1 1 1 0
%d 0 0 0 1
我需要把它转换成像这样的模式矩阵。
A B C DA 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和workshop3相遇两次。
感谢您的任何建议或帮助提前!
发布于 2014-09-08 22:38:46
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个索引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]https://stackoverflow.com/questions/25725535
复制相似问题