2017-10-18 5 views

Répondre

0

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)