Wie kann ich eine Spalte effizient aus einer dünn besetzten Matrix entfernen?
Frage
Wie kann ich eine Spalte einfach und effizient aus der Matrix entfernen, wenn ich das Format sparse.lil_matrix verwende?
Lösung
Ich wollte das selbst und in Wahrheit gibt es noch keinen großartigen Weg, es zu tun. Hier ist ein Weg, es zu tun. Ich habe mich für eine Unterklasse von lil_matrix entschieden und die Funktion remove_col hinzufügen. Wenn Sie möchten, können Sie stattdessen die RemoveCol -Funktion zur lil_matrix -Klasse in Ihrem hinzufügen lib/site-packages/scipy/sparse/lil.py
Datei. Hier ist der Code:
from scipy import sparse
from bisect import bisect_left
class lil2(sparse.lil_matrix):
def removecol(self,j):
if j < 0:
j += self.shape[1]
if j < 0 or j >= self.shape[1]:
raise IndexError('column index out of bounds')
rows = self.rows
data = self.data
for i in xrange(self.shape[0]):
pos = bisect_left(rows[i], j)
if pos == len(rows[i]):
continue
elif rows[i][pos] == j:
rows[i].pop(pos)
data[i].pop(pos)
if pos == len(rows[i]):
continue
for pos2 in xrange(pos,len(rows[i])):
rows[i][pos2] -= 1
self._shape = (self._shape[0],self._shape[1]-1)
Ich habe es ausprobiert und sehe keine Fehler. Ich denke sicherlich, dass es besser ist, als die Spalte herauszuschneiden, was soweit ich weiß, nur eine neue Matrix schafft.
Ich habe mich entschlossen, auch eine Entfernerungsfunktion zu machen, aber ich denke nicht, dass es so gut ist wie Removecol. Ich bin begrenzt, indem ich nicht in der Lage bin, eine Reihe von einem NDarray so zu entfernen, wie ich es möchte. Hier ist Entferner, der zur obigen Klasse hinzugefügt werden kann
def removerow(self,i):
if i < 0:
i += self.shape[0]
if i < 0 or i >= self.shape[0]:
raise IndexError('row index out of bounds')
self.rows = numpy.delete(self.rows,i,0)
self.data = numpy.delete(self.data,i,0)
self._shape = (self._shape[0]-1,self.shape[1])
Vielleicht sollte ich diese Funktionen dem Scipy -Repository einreichen.
Andere Tipps
Viel einfacher und schneller. Möglicherweise brauchen Sie nicht einmal die Konvertierung zu CSR, aber ich weiß nur sicher, dass es mit CSR -Sparse -Matrizen funktioniert und die Konvertierung zwischen kein Problem sein sollte.
from scipy import sparse
x_new = sparse.lil_matrix(sparse.csr_matrix(x)[:,col_list])
Für eine spärliche CSR-Matrix (X) und eine Liste zu löschender Indizes (index_to_drop):
to_keep = list(set(xrange(X.shape[1]))-set(index_to_drop))
new_X = X[:,to_keep]
Es ist einfach, lil_matrices in csr_matrices zu konvertieren.Checken Sie tocsr() ein lil_matrix-Dokumentation
Beachten Sie jedoch, dass der Wechsel von CSR- zu Lil-Matrizen mit tolil() teuer ist.Diese Wahl ist also gut, wenn Sie Ihre Matrix nicht im Lil-Format benötigen.
Sie können einen solchen Webbrowser verwenden:
Zum Übergang zwischen mehreren Ansichten können Sie einfach die + TransitionFromView verwenden: Zum Abbild: Dauer: Optionen: Fertigstellung: Methode des UIView.Mit den Optionen können Sie angeben, welche Art von Übergang Sie möchten.
Beispiel: generasacodicetagpre.
Durch die Betrachtung der Notizen für jede spärliche Matrix, insbesondere in unserem Fall, hat CSC -Matrix die folgenden Vorteile, die in der Dokumentation aufgeführt sind [1]
- Effiziente arithmetische Operationen CSC + CSC, CSC * CSC usw.
- Effiziente Säulenschnitte
- Schnelle Matrixvektorprodukte (CSR, BSR kann schneller sein)
Wenn Sie über die Säulenindizes verfügen, die Sie entfernen möchten, verwenden Sie einfach Slicing. Zum Entfernen von Zeilen verwenden Sie die CSR -Matrix