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
Antwort
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]]])
Es ist ein Wörterbuch-of-Tasten spärliches Format, das sein kann, aus einem Wörterbuch wie diesem gebaut.
Beginnend mit Divakar's
d
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
- 1. ein mehrdimensionales Array in ein anderes mehrdimensionales Array konvertieren, aber mit einer anderen Struktur
- 2. Kopieren eines Wörterbuchs in ein Array in Swift
- 3. Konvertieren von Array-Schlüssel zu mehrdimensionales Array
- 4. Konvertieren eines Wörterbuchs zur Auflistung in C#
- 5. Konvertieren Swift Array Wörterbuch mit Indizes
- 6. (Python) Konvertieren eines Wörterbuchs in eine Liste?
- 7. console.log ein mehrdimensionales Array
- 8. ein mehrdimensionales Array Verfahrgeschwindigkeit
- 9. ein mehrdimensionales Array in rubinSortier
- 10. Sortieren ein mehrdimensionales Array
- 11. array_intersect ein Array gegen ein mehrdimensionales Array
- 12. mehrdimensionales Array in Array
- 13. Algorithmus zum Konvertieren eines mehrdimensionalen Arrays in ein eindimensionales Array
- 14. Zugang ein mehrdimensionales Array mit Punktnotation
- 15. Sortierung ein mehrdimensionales Array mit PHP
- 16. Zugriff auf ein mehrdimensionales Array?
- 17. Echo ein mehrdimensionales Array aus
- 18. in ein mehrdimensionales Array in PHP
- 19. Konvertieren eines Bereichs in ein Bit-Array
- 20. ein mehrdimensionales Array in einer Schleife
- 21. mehrdimensionales Array Indizierung eines einzigen eindimensionalen Array in Python
- 22. Ein Liner: Erstellen eines Wörterbuchs aus Liste mit Indizes als Schlüssel
- 23. Ein mehrdimensionales Array in JavaScript sortieren
- 24. Iterieren durch ein mehrdimensionales Array in Python
- 25. Splitting eine Zeichenfolge in ein mehrdimensionales Array
- 26. Looping durch ein mehrdimensionales Array in Handlebars.js
- 27. Sortierung durch ein mehrdimensionales Array in Python
- 28. PHP ein mehrdimensionales Array in verschachtelte Liste
- 29. Standardisieren ein mehrdimensionales Array in PHP
- 30. Java mehrdimensionales Array Instanziierung
Beispiel Eingabe/Ausgabe? –