Frage

Wie kann ich eine Spalte einfach und effizient aus der Matrix entfernen, wenn ich das Format sparse.lil_matrix verwende?

War es hilfreich?

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.

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.

http://developer.apple.com / Bibliothek / iOS / # Dokumentation / UIKIT / UKIT / uiview_classe / uikiew / uiview.html

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top