Effizientes Subtrahieren des Vektors von der Matrix (Scipy)

Ich habe eine große Matrix als scipy.sparse.csc_matrix gespeichert und möchte von jeder Spalte in der großen Matrix einen Spaltenvektor subtrahieren. Dies ist eine ziemlich häufige Aufgabe, wenn Sie Dinge wie Normalisierung / Standardisierung tun, aber ich kann nicht den richtigen Weg finden, um dies effizient zu tun.

Hier ist ein Beispiel zur Veranschaulichung:

# mat is a 3x3 matrix
mat = scipy.sparse.csc_matrix([[1, 2, 3],
                               [2, 3, 4],
                               [3, 4, 5]])

#vec is a 3x1 matrix (or a column vector)
vec = scipy.sparse.csc_matrix([1,2,3]).T

""" 
I want to subtract `vec` from each of the columns in `mat` yielding...
    [[0, 1, 2],
     [0, 1, 2],
     [0, 1, 2]]
"""

Eine Möglichkeit, das zu erreichen, was ich will, ist das Hackenvec zu sich selbst 3mal, eine 3x3 Matrix ergebend, in der jede Spalte istvec und dann subtrahiere das vonmat. Aber auch hier bin ich auf der Suche nach einer Möglichkeit, dies effizient zu tun, und die Erstellung der gestapelten Matrix nimmt viel Zeit in Anspruch. Ich bin mir sicher, dass es einen magischen Weg gibt, dies mit dem Schneiden und Senden zu tun, aber er entzieht sich mir.

Vielen Dank!

BEARBEITEN: Die Einschränkung "In-Place" wurde entfernt, da sich die Sparsity-Struktur in einem In-Place-Zuweisungsszenario ständig ändern würde.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage