2017-10-18 1 views

Antwort

0

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)
Verwandte Themen