如何将字典的字典转换成矩阵?

时间:2019-07-19 08:36:08

标签: python arrays dictionary matrix

我想计算日志文件中出现的多个项目之间的相关百分比。这样,我得到它们出现的次数除以存在另一个项目时出现的次数。 我不会在细节上过多介绍,但是这种相关性不是对称的 (A和B之间的相关性与B和A之间的相关性不同)

作为输出,我有一本字典,其格式如下:

{
    itemA:  {
        itemB: 0.85,
        itemC: 0.12
    },
    itemB:  {
        itemC: 0.68,
        itemA: 0.24
    },
    itemC:  {
        itemA: 0.28
    }
}

我曾尝试使用DictVectorizer中的sklearn,但由于它需要字典列表,因此无法正常工作。

我希望输出成为matplotlib可视化的矩阵

类似这样的东西

[[1,0.85,0.12]
[0.68,1,0.24]
[0.28,0,1]]

如果可能的话,我还希望有一个matplotlib可视化效果,其中每行和每一列都有一个图例,因为我的字典有3种以上的项。

我希望一切都清楚。 谢谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用pandas和numpy有效地做到这一点:

import pandas as pd

d = {
    'itemA':  {
        'itemB': 0.85,
        'itemC': 0.12
    },
    'itemB':  {
        'itemA': 0.68,
        'itemC': 0.24
    },
    'itemC':  {
        'itemA': 0.28
    }
}

df = pd.DataFrame(d)

# since this is a matrix of co-occurrences of a set of objects,
# sort columns and rows alphabetically
df = df.sort_index(axis=0)
df = df.sort_index(axis=1)

# the matrix is now the values of the dataframe
a = df.values.T

# if needed, fill the diagonal with 1 and replace NaN with 0
import numpy as np

np.fill_diagonal(a, 1)
a[np.isnan(a)] = 0

现在的矩阵是:

array([[1.  , 0.85, 0.12],
       [0.68, 1.  , 0.24],
       [0.28, 0.  , 1.  ]])

要可视化此矩阵,请执行以下操作:

import matplotlib.pyplot as plt
plt.matshow(a)
plt.show()

行ID和列ID将显示为标签。

答案 1 :(得分:0)

这是与数组配合使用的代码,但是您可以轻松地将其适应要使用的序列。

dictionary = {
    'itemA':  {
        'itemB': 0.85,
        'itemC': 0.12
    },
    'itemB':  {
        'itemA': 0.68,
        'itemC': 0.24
    },
    'itemC':  {
        'itemA': 0.28
    }
}

matrix = []
i = 0
for v in dictionary.values():
    tmp_mat = []
    for h in v.values():
        if len(tmp_mat) == i:
            tmp_mat.append(1)
        tmp_mat.append(h)
    i += 1
    if len(tmp_mat) == len(v):
        tmp_mat.append(1)
    matrix.append(tmp_mat)

print(matrix)

输出:

  

[[1,0.85,0.12],[0.68,1,0.24],[0.28,1]]

unpacking keys and values of a dictionary