2016-06-20 8 views
0

Ich habe diesen CodeEinfache erstreckt CSR Matrix durch Hinzufügen einer Spalte

import numpy as np 
from scipy.sparse import csr_matrix 
q = csr_matrix([[1.], [0.]]) 
ones = np.ones((2, 1)) 

und jetzt, wie diejenigen Spalte hinzuzufügen q zu Matrix Ergebnis Form haben (2, 2)? (Matrix Q ist spärlich und ich möchte nicht Art von CSR ändern)

+0

Dies ist nicht möglich ohne Konvertierung in ein anderes Format dazwischen. Ein effizientes Hinzufügen einer Zeile ist in CSR möglich, ein effizientes Hinzufügen einer Spalte ist jedoch nicht möglich. Wenn Sie Spalten hinzufügen müssen, sollten Sie besser ein anderes Format verwenden. –

+0

ok - also Transponieren, Hinzufügen von Zeilen und Transponieren sollte wieder zum Trick, aber es ist nicht so performant ... – quester

+0

ok Ich fand die Antwort ... scipy.sparse.vstack und scipy.sparse.hstack – quester

Antwort

1

Der Code für sparse.hstack ist

return bmat([blocks], format=format, dtype=dtype) 

für bmat, dann ist ein blocks1xN Array. Wenn sie alle csc sind, hat es eine schnelle Version des Stapels:

A = _compressed_sparse_stack(blocks[0,:], 1) 

Umgekehrt sparse.vstack mit csr Matrizes tut

A = _compressed_sparse_stack(blocks[:,0], 0) 

In der Tat gegeben, wie die Daten in einer csr Matrix gespeichert ist es relativ leicht zu fügen Sie Zeilen (oder Spalten für csc) hinzu (ich kann das erläutern, wenn das eine Erläuterung benötigt).

Ansonsten bmat tut:

# convert everything to COO format 
# calculate total nnz 
data = np.empty(nnz, dtype=dtype) 
for B in blocks: 
    data[nnz:nnz + B.nnz] = B.data 
return coo_matrix((data, (row, col)), shape=shape).asformat(format) 

Mit anderen Worten: es wird die data, row, col Werte für jeden Block, verkettet sie, macht eine neue coo Matrix und schließlich wandelt sie in dem Wunsch Format.

sparse konvertiert problemlos zwischen den Formaten. Sogar die Anzeige einer Matrix kann eine Konvertierung beinhalten - für das (i,j) d Format, für csr für dichtes/Array. sparse.nonzero konvertiert zu coo. Die meisten mathematischen Formeln werden in csr konvertiert. Ein csr wird transponiert, indem es in einen csc (ohne Änderung der Attributarrays) umgewandelt wird. Ein Großteil der Konvertierung erfolgt im kompilierten Code, sodass Sie keine Verzögerungen sehen.

Hinzufügen von Spalten direkt zu csr Format ist eine Menge Arbeit. Alle 3 Attributfelder müssen Zeile für Zeile geändert werden. Auch hier könnte ich bei Bedarf ins Detail gehen.

Verwandte Themen