Как ускорить построение очень большой разреженной матрицы, где каждая строка имеет только один ненулевой элемент в соответствии с столбцом, и каждый столбец имеет равное число (в среднем) ненулевых элементов?Быстрое построение очень большой разреженной матрицы
У меня есть огромная (разреженная) матрица размера N1
матрицы с размерностью N2
, скажем, например, размера 1e8
5e4
, матрица с размерностью, где каждая строка содержит только один ненулевой элемент, который случайным образ выбирается без замены на numpy.random.choice(numpy.arange(N2),size=N2,replace=False)
.
Насколько я знаю, единственный способ построить матрицу - запустить numpy.random.choice()
в цикле for
N1
раз. Как N1
очень большой, чтобы ускорить процесс, я использую 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
Тем не менее, для N1
приближается 1e6
и за его пределами кода он занимает слишком много времени, чтобы закончить. Я подозреваю, что может быть гораздо более эффективный способ построения разреженной матрицы. Любая другая стратегия в виду, чтобы ускорить и построить матрицу в удобное для человека время?
FYI: В тексте вопроса, вы говорите 'numpy.random.choice (numpy.arange (N2), размер = N2, замените = 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 Да, извините. Он должен был быть «ложным» в коде. – maurizio