Wie kann man die Konstruktion einer sehr großen dünn besetzten Matrix beschleunigen, in der jede Zeile nur ein Element ungleich null in einer Spalte hat und jede Spalte eine gleiche Anzahl (im Durchschnitt) von null Elementen hat?Schneller Aufbau einer sehr großen spärlichen Matrix
I eine riesige (sparse) Matrix der Größe N1
-by- N2
, sagen wir beispielsweise der Größe 1e8
-by- 5e4
, wobei jede Zeile enthält nur ein Nicht-Null-Element haben, die zufällig ohne Ersatz durch numpy.random.choice(numpy.arange(N2),size=N2,replace=False)
gewählt wird.
Soweit ich weiß, ist der einzige Weg, wie ich die Matrix bauen kann, numpy.random.choice()
in einer for
Schleife N1
mal zu laufen. Als N1
sehr groß ist, die Dinge zu beschleunigen Ich bin mit scipy.weave
:
import numpy as np
from scipy import weave
from scipy.weave import converters
import scipy.sparse as sparse # Cython import
def weave_sparse(N1,N2,w):
conn_matrix = sparse.dok_matrix((N1,N2))
fac = lambda N : np.random.choice(np.arange(N), size=N, replace=False)[0]
code = """
int i;
py::tuple arg(1);
arg[0] = N2;
for(i=0;i<N1;i++) conn_matrix[i,(int) fac.call(arg)] = w;
"""
weave.inline(code,['conn_matrix','N1','N2', 'w', 'fac'],
compiler='gcc',extra_compile_args=['-std=c++11 -Ofast'],force=0)
return conn_matrix
Noch für N1
1e6
nähern und über den Code abzuschließen es zu lange dauert. Ich vermute, dass es einen viel effizienteren Weg zum Aufbau der Sparse-Matrix geben könnte. Irgendeine andere Strategie, um die Matrix in einer für Menschen lesbaren Zeit zu beschleunigen und aufzubauen?
FYI: Im Text der Frage, sagen Sie 'numpy.random.choice (numpy.arange (N2), Größe = N2, ersetzen = Falsch) '. Das entspricht "np.random.shuffle (np.arange (N2))" oder "np.random.permutation (N2)". Im Code verwenden Sie 'np.random.choice (np.arange (N), Größe = N, ersetzen = True) [0]'. Das entspricht "np.random.randint (0, N)". (Warum generieren 'size = N' und dann nur das erste Element?) –
@Warren Yep entschuldigen. Es hätte "False" im Code sein sollen. – maurizio