[英]How do I create a co-occurrance matrix in Python?
我有N
列的 dataframe。 dataframe 中的每个元素都在0
, N-1
范围内。
例如,我的数据框可以类似于 ( N=3
):
A B C
0 0 2 0
1 1 0 1
2 2 2 0
3 2 0 0
4 0 0 0
我想创建一个大小为 N x N 的共现矩阵(如果有不同的标准名称,请纠正我),其中每个元素 ij 包含元素 i 和 j 假定相同值的次数。
A B C
A x 2 3
B 2 x 2
C 3 2 x
其中,例如, matrix[0, 1]
表示 A 和 B 两次采用相同的值。 我不关心对角线上的值。
最聪明的方法是什么?
DataFrame.corr
我们可以定义一个自定义可调用对象 function 来计算 dataframe 的列之间的相关性,此可调用对象将两个一维 numpy arrays 作为其输入 arguments 并返回这两个 82173498 中的元素彼此相等的次数的计数
df.corr(method=lambda x, y: (x==y).sum())
A B C
A 1.0 2.0 3.0
B 2.0 1.0 2.0
C 3.0 2.0 1.0
让我们尝试在转置和求和轴 2 上广播:
import pandas as pd
df = pd.DataFrame({
'A': {0: 0, 1: 1, 2: 2, 3: 2, 4: 0},
'B': {0: 2, 1: 0, 2: 2, 3: 0, 4: 0},
'C': {0: 0, 1: 1, 2: 0, 3: 0, 4: 0}
})
vals = df.T.values
e = (vals[:, None] == vals).sum(axis=2)
new_df = pd.DataFrame(e, columns=df.columns, index=df.columns)
print(new_df)
e
:
[[5 2 3]
[2 5 2]
[3 2 5]]
转回一个dataframe:
new_df = pd.DataFrame(e, columns=df.columns, index=df.columns)
new_df
:
A B C
A 5 2 3
B 2 5 2
C 3 2 5
我不知道最聪明的方法,但我认为这可行:
import numpy as np
m = np.array([[0, 2, 0], [1, 0, 1], [2, 2, 0], [2, 0, 0], [0, 0, 0]])
n = 3
ans = np.zeros((n, n))
for i in range(n):
for j in range(i+1, n):
ans[i, j] = len(m) - np.count_nonzero(m[:, i] - m[:, j])
print(ans + ans.T)
我有N
列的 dataframe。 dataframe 中的每个元素都在0
, N-1
范围内。
例如,我的数据帧可能类似于( N=3
):
A B C
0 0 2 0
1 1 0 1
2 2 2 0
3 2 0 0
4 0 0 0
我想创建一个大小为 N x N 的共现矩阵(如果有不同的标准名称,请纠正我),其中每个元素 ij 包含元素 i 和 j 假定相同值的次数。
A B C
A x 2 3
B 2 x 2
C 3 2 x
例如, matrix[0, 1]
表示 A 和 B 假设相同的值 2 次。 我不在乎对角线上的值。
最聪明的方法是什么?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.