2012-05-16 123 views
17

我有一個巨大的字典是這樣的:將2D字典到numpy的矩陣

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 

我如何做到這一點? 感謝

+0

第一迭代通字典和然後找到行和列的數目..之後由於我迭代中的每個條目爲所定義的向量..然後在轉換另一個迭代通ID1 ..它與相關聯的其矢量 – Fraz

+0

你只是想要它打印出來嗎?爲什麼它需要進入一個numpy矩陣 –

+0

@PaulSeeb:no no ..其實我想以後執行這個矩陣的svd .. – Fraz

回答

9

使用列表理解把一個字典到列表和/或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添加到列表中。

+0

嗨,這給了我:array([[20 ,30],[50]],dtype = object) 但我期待的是[[20,30,0],[0,0,50]] – Fraz

+0

@Fraz:啊,所以你有一個不規則的數字每個作者字典的關鍵字。讓我編輯。 –

22

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 
+0

正是我需要的 - 謝謝! –

+0

@HYRY可以使用pandas DataFrame作爲matplotlib.pcolor的輸入來創建熱圖嗎?還是必須先轉換爲numpy數組? –

+0

如果使用可變長度字典值,請使用'DataFrame.from_dict(books,orient ='index')。fillna(0)'來代替'ValueError'。 – interpolack

0

在2018年,我覺得熊貓0.22支持此out of the box。 具體請檢查from_dict分類方法DataFrame

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

pd.DataFrame.from_dict(books, orient='columns', dtype=None)