如何将2d字典转换为numpy矩阵?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (93)

我有字典如下:

d[id1][id2] = value

例子:

books["auth1"]["humor"] = 20
books["auth1"]["action"] = 30
books["auth2"]["comedy"] = 20

如下:

每个“auth”键都可以有与它们相关的任意一组“类型”。现在我想要的是把它转换成矩阵的形式,类似于:

                    "humor"       "action"        "comedy"
      "auth1"         20            30               0
      "auth2"          0            0                20

我该怎么做?

提问于
用户回答回答于

使用列表理解可以将DICT转换为列表和/或Numpy数组的列表:

np.array([[books[author][genre] for genre in sorted(books[author])] for author in sorted(books)])

显然,每个子词典中都有不规则的键数。列出所有类型:

genres = ['humor', 'action', 'comedy']

然后以正常的方式遍历字典:

list_of_lists = []
for author_name, author in sorted(books.items()):
    titles = []
    for genre in genres:
        try:
            titles.append(author[genre])
        except KeyError:
            titles.append(0)
    list_of_lists.append(titles)

books_array = numpy.array(list_of_lists)

基本上,我试图从每个键中添加一个值genres一份清单。如果键不在那里,则会抛出一个错误。我捕捉到错误,并将0添加到列表中。

用户回答回答于

pandas:

books = {}
books["auth1"] = {}
books["auth2"] = {}
books["auth1"]["humor"] = 20
books["auth1"]["action"] = 30
books["auth2"]["comedy"] = 20

from pandas import *

df = DataFrame(books).T.fillna(0)

输出如下:

       action  comedy  humor
auth1      30       0     20
auth2       0      20      0

扫码关注云+社区