Seite 1 von 1

Koordinaten in Matrix transformieren

Verfasst: Montag 5. Oktober 2015, 14:48
von Poseidonius
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

Re: Koordinaten in Matrix transformieren

Verfasst: Montag 5. Oktober 2015, 16:15
von pillmuncher
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?

Re: Koordinaten in Matrix transformieren

Verfasst: Montag 5. Oktober 2015, 16:18
von 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]]

Re: Koordinaten in Matrix transformieren

Verfasst: Dienstag 6. Oktober 2015, 07:54
von MagBen
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()

Re: Koordinaten in Matrix transformieren

Verfasst: Freitag 9. Oktober 2015, 14:50
von Poseidonius
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