Koordinaten in Matrix transformieren

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Poseidonius
User
Beiträge: 63
Registriert: Montag 23. Januar 2006, 08:58

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
Benutzeravatar
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:

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]])
Aber vielleicht kennt jemand eine bessere Lösung?
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

@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.

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)
Gibt aus:

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]]
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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()
a fool with a tool is still a fool, www.magben.de, YouTube
Poseidonius
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
Antworten