Hallo zusammen,
ich habe ein array, dass in 3 Spalten jeweils zwei Matrixindizes und einen zugehörigen Wert enthält. Es sieht also ungefähr so aus
0,0,8.1
0,1,2.3
0,2,2.1
...
300,300,1.2
Daraus möchte ich nun die Matrix rekonstruieren.
8.1 2.3 2.1 ...
... .... ....
... ... 1.2
Wichtig dabei ist, dass die Daten sind nicht komplett sind, sprich die Liste hat weniger
als 300x300 Einträge. Ein reshape oder ähnliches entfällt damit. Gibt es eine effizientere Lösung als eine Schleife?
Danke Euch
Sebastian
Koordinaten in Matrix transformieren
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
Mein numpy fu ist ja eher klein, aber ich vermute, man könnte vielleicht sowas machen:Aber vielleicht kennt jemand eine bessere Lösung?
Code: Alles auswählen
>>> import scipy.sparse as sparse
>>> import numpy as np
>>> data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> rs, cs, ds = np.matrix.transpose(data)
>>> sparse.coo_matrix((ds, (rs, cs)), shape=(max(rs)+1, max(cs)+1)).toarray()
array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 3, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 6, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 9]])
In specifications, Murphy's Law supersedes Ohm's.
@Poseidonius: Wenn die Endform bekannt ist kann man sich aus den ersten beiden Spalten die ”flachen” Koordinaten für das Ergebnis ausrechnen und dann als Index verwenden.
Gibt aus:
Code: Alles auswählen
data = np.array(
[
[0, 0, 8.1],
[0, 1, 2.3],
[0, 2, 2.1],
[299, 299, 1.2],
],
)
y, x, v = data.T
N = 300
A = np.zeros((N, N))
A.flat[x.astype(int) + y.astype(int) * N] = v
print(A)
Code: Alles auswählen
[[ 8.1 2.3 2.1 ..., 0. 0. 0. ]
[ 0. 0. 0. ..., 0. 0. 0. ]
[ 0. 0. 0. ..., 0. 0. 0. ]
...,
[ 0. 0. 0. ..., 0. 0. 0. ]
[ 0. 0. 0. ..., 0. 0. 0. ]
[ 0. 0. 0. ..., 0. 0. 1.2]]
Bei 300x300 Elementen könnte scipy.sparse.csr_matrix für Dich interessant sein, je nachdem wie sparse Deine Matrix ist und was Du danach mit der Matrix machen möchtest arbeitest Du mit csr_matrix oder mit csr_matrix.todense() weiter.
Code: Alles auswählen
import numpy as np
from scipy.sparse import csr_matrix
data = np.array(
[
[0, 0, 8.1],
[0, 1, 2.3],
[1, 2, 2.1],
[2, 0, -3.5],
[297, 2, 4.1],
[299, 299, 1.2],
],
)
row, col, v = data.T
N = 300
A = csr_matrix( (v,(row,col)), shape=(N,N) )
print A
print A.todense()
-
- User
- Beiträge: 63
- Registriert: Montag 23. Januar 2006, 08:58
Sehr cool! Genau was ich gesucht habe! Vielen Dank für den Hinweis auf die dünnbesetzten Matrizen!
Grüße und ein schönes Wochenende
Sebastian
Grüße und ein schönes Wochenende
Sebastian