Ein Ansatz (lineare Zeitbetrieb auf #nnz only):
from scipy.sparse import find, csr_matrix
import numpy as np
# Create the data (Taken from DavidG's answer! Thanks!)
data = np.array([-1, 0, -1, 0, -1, 1, 1, -1, 0, -1, 0, 0]).reshape(2, 6)
a = csr_matrix((data), dtype=np.int8)
nnz_inds = a.nonzero()
keep = np.where(a.data == 1)[0]
n_keep = len(keep)
b = csr_matrix((np.ones(n_keep), (nnz_inds[0][keep], nnz_inds[1][keep])), shape=a.shape)
# CHECK
print('a')
print(a.todense())
print('b')
print(b.todense())
Ausgang:
a
[[-1 0 -1 0 -1 1]
[ 1 -1 0 -1 0 0]]
b
[[ 0. 0. 0. 0. 0. 1.]
[ 1. 0. 0. 0. 0. 0.]]
Die Grundidee ist einfach:
- alle Positionen sehen, wo nonzeroes sind (sparsity Nutzung)
- Filter über alle Positionen zu gelangen, wo 1'en sind
- eine neue Matrix von Grund auf neu erstellen mit die vorbereiteten Positionen & Daten (unter Ausnutzung von Sparsity)