繁体   English   中英

如何在 Python 中创建同现矩阵?

[英]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 中的每个元素都在0N-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM