2017-12-18 4 views
0

ich eine 2D numpy Array haben, der so aussieht,eine COO-Matrix aus einem Array numpy 2D Erstellen

[[3, 4, 5, 6], [4, 5, 6, 7], [9, 10, 3, 5]] 

I umgewandelt diese in eine COO-Matrix mit dem folgenden Code:

# Flatten 2D array 
data = np.asarray(twod_array).flatten() 
row = np.arange(0, len(data)) 
col = np.arange(0, len(row)) 
# Make COO matrix 
mat = coo_matrix((data, (row, col)), shape=(len(row), len(row))) 

Ist Dies ist die korrekte Art, ein zweidimensionales Array in eine COO-Matrix umzuwandeln.

EDIT

Was ich versuche, dies zu tun ist, habe ich Teile auf einer coloumn und Artikel auf der anderen Seite.

Ich habe die obigen Daten in Zahlen umgewandelt, damit sie weiterverarbeitet werden können.

parts   items 
1, 2, 3  1 
4, 5, 3  2 

Jetzt möchte ich die obigen Daten in LightFM einspeisen, also habe ich ein 2D-Array wie dieses erstellt.

[[1, 2, 3, 1], [4, 5, 3, 2]] 

Aber da LightFM des Fit-Verfahren dauert nur in np.float32 coo_matrix der Form [n_users, n_items], welches ein Matrix-Interaktionen benutzer Element enthält. Ich konvertierte das 2D-Array unter Verwendung der oben genannten Methode.

+0

Warum glauben Sie, dass das nicht stimmt? Führt das zu Fehlern? –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Keine Fehler. Ich benutze es, um ein LightFM-Modell zu trainieren und die Empfehlungen, die vom Modell generiert werden, sind sehr seltsam. –

+0

Sie können 'mat.A' verwenden, um zu überprüfen. Was ist Ihre erwartete Leistung? – Akavall

Antwort

1
In [301]: A = np.array([[3, 4, 5, 6], [4, 5, 6, 7], [9, 10, 3, 5]]) 
In [302]: A 
Out[302]: 
array([[ 3, 4, 5, 6], 
     [ 4, 5, 6, 7], 
     [ 9, 10, 3, 5]]) 

Ihr Weg, um eine Matrix zu schaffen:

In [305]: data =A.flatten() 
In [306]: M = sparse.coo_matrix((data,(np.arange(len(data)),np.arange(len(data)) 
    ...:))) 
In [307]: M 
Out[307]: 
<12x12 sparse matrix of type '<class 'numpy.int32'>' 
    with 12 stored elements in COOrdinate format> 

print(M) werden diese 12 Werte mit ihren von Koordinaten zeigen.

Wenn es nicht zu groß ist, möchte ich die Matrix als ein Array anzeigen. M.A ist Abkürzung für M.toarray():

In [308]: M.A 
Out[308]: 
array([[ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 5, 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, 4, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 5, 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, 7, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5]]) 

Blick auf die Diagonale - das ist die 12 Werte des ursprünglichen Arrays. Ist es das was du willst? Das ursprüngliche 3x4 Layout von A ist komplett verloren. Es hätte auch eine 1D-Liste dieser 12 Nummern sein können.

Alternativ könnten Sie einfach das Array zu dem spärlichen Konstruktor übergeben, eine spärliche Nachbildung des Original

In [309]: M1 = sparse.coo_matrix(A) 
In [310]: M1 
Out[310]: 
<3x4 sparse matrix of type '<class 'numpy.int32'>' 
    with 12 stored elements in COOrdinate format> 
In [311]: M1.A 
Out[311]: 
array([[ 3, 4, 5, 6], 
     [ 4, 5, 6, 7], 
     [ 9, 10, 3, 5]]) 

Statt einer 12x12 diagonal produzieren, ist dies eine 3x4-Array ohne 0en. Dies macht mehr Sinn, wenn A bereits viele Nullen hatte.

Wissen Sie wirklich, welche Art von Sparse-Matrix Sie brauchen?

+0

Ich habe das versucht, aber ich bekomme 'ValueError (" Nicht alle geschätzten Parameter sind endlich, " ValueError: Nicht alle geschätzten Parameter sind endlich, Ihr Modell könnte divergiert haben. Versuchen Sie, die Lernrate oder normalisierende Merkmalswerte und Stichprobengewichte. " –

+0

Siehe Edit –