2012-05-16 23 views
17

Ho un enorme qualcosa di dizionario come questo:conversione di un dizionario 2d a una matrice NumPy

d[id1][id2] = value 

esempio:

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

e così via ..

Ciascuno dei "auth "I tasti possono avere qualsiasi gruppo di" generi "associati a questi. Il valore di un articolo con chiave è il numero di libri che hanno scritto.

Ora quello che voglio è quello di convertirlo in una forma di matrice ... qualcosa di simile:

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

Come faccio a fare questo? Grazie

+0

prima iterazione attraverso il dizionario e poi trovare il numero di righe e colonne .. dopo che, come sto iterazione convertire ogni voce come un vettore definito .. e poi in un altro iterazione attraverso id1 .. associandolo con la loro vettori – Fraz

+0

Vuoi solo che venga stampato così? Perché ha bisogno di entrare in una matrice numpy –

+0

@PaulSeeb: no no .. in realtà voglio in seguito eseguire svd di questa matrice .. – Fraz

risposta

9

Utilizzare un elenco di comprensione per trasformare un dict in una lista di liste e/o un allineamento NumPy:

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

EDIT

A quanto pare si dispone di un numero irregolare di chiavi in ​​ogni sub-dizionario. Fate una lista di tutti i generi:

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

E poi scorrere i dizionari in modo normale:

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) 

Fondamentalmente sto cercando di aggiungere un valore da ogni chiave in genres a un elenco . Se la chiave non è presente, genera un errore. Prendo l'errore e aggiungo uno 0 alla lista.

+0

Ciao, questo mi dà: array ([[20 , 30], [50]], dtype = oggetto) ma quello che mi aspettavo era [[20, 30, 0], [0,0,50]] – Fraz

+0

@Fraz: ah, quindi hai un numero irregolare di chiavi per ogni autore dettate Fammi modificare –

22

pandas fare molto bene:

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) 

L'output è:

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

esattamente quello di cui avevo bisogno - grazie! –

+0

@HYRY È possibile utilizzare un DataFrame panda come input per matplotlib.pcolor per creare una mappa di calore? O prima bisogna convertirsi in un array numpy? –

+0

In caso di valori di dizionario di lunghezza variabile, utilizzare 'DataFrame.from_dict (books, orient = 'index'). Fillna (0)' invece di impedire 'ValueError'. – interpolack

0

Nel 2018, penso che Pandas 0.22 supporta questa out of the box. In particolare, si prega di verificare il metodo di classe from_dict di 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) 
Problemi correlati