各行が列に対応する非ゼロ要素を1つしか持たず、各列の要素数がゼロでない(平均して)等しい非常に大きなスパース行列の構成を高速化する方法はありますか?非常に大きなスパース行列の高速構築
IサイズN1
行列N2
の巨大な(スパース)行列を有する、各行がランダムnumpy.random.choice(numpy.arange(N2),size=N2,replace=False)
によって交換することなく選択される唯一の非ゼロ要素が含まサイズ1e8
行列5e4
の例えば言います。
私が知る限り、私が行列を構築する唯一の方法は、ループN1
回でnumpy.random.choice()
を実行することです。
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
を、N1
は1e6
に近づいて、コードを超えて、それが完了に時間がかかりすぎてのために:N1
として私はscipy.weave
を使用しています物事をスピードアップするために、非常に大きいです。私はスパース行列を構築するためにはるかに効率的な方法があると思う。人間が読める時間にマトリックスをスピードアップして構築するための他の戦略
FYI:質問のテキストでは、あなたが 'numpy.random.choice(numpy.arange(N2)を言い、サイズ= N2、replace = False) 'を実行します。これは 'np.random.shuffle(np.arange(N2))'または 'np.random.permutation(N2)'と同等です。コードでは 'np.random.choice(np.arange(N)、size = N、replace = True)[0]'を使用します。これは 'np.random.randint(0、N)'に相当します。 (なぜ 'size = N'を生成してから最初の要素を取るのですか?) –
@Warrenコード内では 'False'だったはずです。 – maurizio