Une approche (opérations en temps linéaire sur #nnz seulement):
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())
sortie:
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.]]
L'idée de base est simple:
- regarder toutes les positions où nonzeroes sont (exploitaient sparsity)
- filtre ci-dessus pour obtenir toutes les positions où 1 de sont
- créer une nouvelle matrice à partir de zéro en utilisant les positions préparées & données (exploitant la parcimonie)