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

2024-10-02 02:40:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个N列的数据帧。数据帧中的每个元素都在0N-1范围内

例如,我的dataframce可以类似(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

我想创建一个大小为nxn的共现矩阵(如果有不同的标准名称,请更正),其中每个元素ij包含元素I和j采用相同值的次数

    A   B   C
A   x   2   3
B   2   x   2
C   3   2   x

其中,例如,matrix[0, 1]表示A和B假设相同的值2次。 我不在乎对角线上的值

最聪明的方法是什么


Tags: 数据方法名称元素标准矩阵次数matrix
3条回答

^{}

我们可以定义一个自定义的可调用函数来计算dataframe列之间的相关性,这个可调用函数将两个1D numpy数组作为其输入参数,并返回这两个数组中元素彼此相等的次数计数

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

我不知道最聪明的方法是什么,但我认为这是可行的:

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)

让我们尝试通过换位和求和轴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]]

返回到数据帧:

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

相关问题 更多 >

    热门问题