2016-08-02 15 views
4

Ich habe ein Wörterbuch mit Einträgen, die als {(k,i): value, ...} gekennzeichnet sind. Ich möchte dieses Wörterbuch nun in ein 2d-Array konvertieren, wobei der Wert für ein Element des Arrays an der Position [k,i] der Wert aus dem Wörterbuch mit der Bezeichnung (k,i) ist. Die Länge der Zeilen hat nicht notwendigerweise die gleiche Größe (z. B. kann die Zeile k = 4 auf den Index i = 60 gehen, während die Zeile k = 24 auf den Index i = 31 gehen kann). Aufgrund der Asymmetrie ist es in Ordnung, alle zusätzlichen Einträge in einer bestimmten Zeile gleich 0 zu machen, um eine rechteckige Matrix zu erhalten.Konvertieren eines Wörterbuchs mit bekannten Indizes in ein mehrdimensionales Array

+0

Beispiel Eingabe/Ausgabe? –

Antwort

3

Hier ist ein Ansatz -

# Get keys (as indices for output) and values as arrays 
idx = np.array(d.keys()) 
vals = np.array(d.values()) 

# Get dimensions of output array based on max extents of indices 
dims = idx.max(0)+1 

# Setup output array and assign values into it indexed by those indices 
out = np.zeros(dims,dtype=vals.dtype) 
out[idx[:,0],idx[:,1]] = vals 

Wir auch schwach besetzte Matrizen verwenden könnte die endgültige Ausgabe zu erhalten. z.B. mit coordinate format sparse matrices. Dies wäre speichereffizient, wenn es als dünn besetzte Matrizen gehalten wird. So könnte der letzte Schritt durch so etwas wie diese ersetzt werden -

from scipy.sparse import coo_matrix 

out = coo_matrix((vals, (idx[:,0], idx[:,1])), dims).toarray() 

Probelauf -

In [70]: d 
Out[70]: {(1, 4): 120, (2, 2): 72, (2, 3): 100, (5, 2): 88} 

In [71]: out 
Out[71]: 
array([[ 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 120], 
     [ 0, 0, 72, 100, 0], 
     [ 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0], 
     [ 0, 0, 88, 0, 0]]) 

Um es für ndarrays einer beliebigen Anzahl von Dimensionen Generika zu machen, können wir verwenden linear- indexieren und verwenden Sie np.put, um Werte dem Ausgabe-Array zuzuweisen. So wird in unserem ersten Ansatz, ersetzen Sie einfach den letzten Schritt des Wertes mit so etwas wie dieser Zuordnung -

np.put(out,np.ravel_multi_index(idx.T,dims),vals) 

Probelauf -

In [106]: d 
Out[106]: {(1,0,0): 99, (1,0,4): 120, (2,0,2): 72, (2,1,3): 100, (3,0,2): 88} 

In [107]: out 
Out[107]: 
array([[[ 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0]], 

     [[ 99, 0, 0, 0, 120], 
     [ 0, 0, 0, 0, 0]], 

     [[ 0, 0, 72, 0, 0], 
     [ 0, 0, 0, 100, 0]], 

     [[ 0, 0, 88, 0, 0], 
     [ 0, 0, 0, 0, 0]]]) 
0

Es ist ein Wörterbuch-of-Tasten spärliches Format, das sein kann, aus einem Wörterbuch wie diesem gebaut.

Beginnend mit Divakar'sd Beispiel:

In [1189]: d={(1, 4): 120, (2, 2): 72, (2, 3): 100, (5, 2): 88} 

eine leere Sparse Matrix der rechten Form machen und dtype:

In [1190]: M=sparse.dok_matrix((6,5),dtype=int) 
In [1191]: M 
Out[1191]: 
<6x5 sparse matrix of type '<class 'numpy.int32'>' 
    with 0 stored elements in Dictionary Of Keys format> 

die d Werte hinzufügen über einen Wörterbuch update. Dies funktioniert, weil dieses spezielle Sparse-Format eine dict Unterklasse ist. Seien Sie ware aber, dass dieser Trick nicht dokumentiert ist (zumindest nicht, dass ich mir bewusst bin):

In [1192]: M.update(d) 
In [1193]: M 
Out[1193]: 
<6x5 sparse matrix of type '<class 'numpy.int32'>' 
    with 4 stored elements in Dictionary Of Keys format> 
In [1194]: M.A # convert M to numpy array (handy display trick) 
Out[1194]: 
array([[ 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 120], 
     [ 0, 0, 72, 100, 0], 
     [ 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0], 
     [ 0, 0, 88, 0, 0]]) 

M kann zu den anderen spärlichen Formaten konvertiert werden, coo, csr. In der Tat sparse macht diese Art der Konvertierung von selbst, abhängig von der Verwendung (Anzeige, Berechnung, etc).

In [1196]: print(M) 
    (2, 3) 100 
    (5, 2) 88 
    (1, 4) 120 
    (2, 2) 72 
Verwandte Themen