Хотя не самый быстрый способ построения разреженной матрицы, это не ужасно медленно либо, по крайней мере, не шаг lil
назначения:
In [204]: N=100
In [205]: M=sparse.lil_matrix((N,N))
In [206]: for i in range(N):
...: for j in range(N):
...: M[i,j]=(i==j)
In [207]: M
Out[207]:
<100x100 sparse matrix of type '<class 'numpy.float64'>'
with 100 stored elements in LInked List format>
Это спасло только ненулевые значения M
. Я почти не видел задержки во время цикла.
Так что я думаю, что большая часть времени тратится в выражении panadas
индексации:
np.sum(data[data['source_node']==i].destination_node.isin(data[data['source_node']==j].destination_node))
Преобразование данных, часто текстуального, в coocurance подсчетов разреженные матрицы часто придумывает. Они используются в обучающем коде, поиске шаблонов и т. Д. scikit-learn
часто используется. Также tensorflow
.
Для N = 1000
In [212]: %%timeit
...: M=sparse.lil_matrix((N,N))
...: for i in range(N):
...: for j in range(N):
...: M[i,j]=(i==j)
...:
1 loop, best of 3: 7.31 s per loop
Итеративно назначая эти значения в плотном массиве быстрее, даже если мы включаем преобразование в разреженной в конце.
In [213]: %%timeit
...: M=np.zeros((N,N))
...: for i in range(N):
...: for j in range(N):
...: M[i,j]=(i==j)
...:
1 loop, best of 3: 353 ms per loop
In [214]: %%timeit
...: M=np.zeros((N,N))
...: for i in range(N):
...: for j in range(N):
...: M[i,j]=(i==j)
...: M = sparse.lil_matrix(M)
...:
1 loop, best of 3: 353 ms per loop
Но для очень большого случая создание промежуточного плотного массива может вызвать проблемы с памятью.
показывая нам, что ваш код будет хорошим началом. и 10^12 вычислений неосуществимо слишком высоки. –
И насколько редки ваши матрицы? Обычно подход с использованием dict, в котором ключи работают с матричными координатами. – jsbueno
Это Python 2 или 3? Если это 2, вы должны использовать 'xrange' вместо' range'. –