Для создания scipy sparse matrix у меня есть индексы массива или строки и столбца I
и J
вместе с массивом данных V
. Я использую те построить матрицу в COO format, а затем преобразовать его в CSR,SciPy разреженная матрица (COO, CSR): Очистить строку
matrix = sparse.coo_matrix((V, (I, J)), shape=(n, n))
matrix = matrix.tocsr()
У меня есть набор индексов строк, для которых единственная запись должна быть 1.0
по диагонали. До сих пор, я иду через I
, найти все индексы, которые нужно протирая, и делать только что:
def find(lst, a):
# From <http://stackoverflow.com/a/16685428/353337>
return [i for i, x in enumerate(lst) if x in a]
# wipe_rows = [1, 55, 32, ...] # something something
indices = find(I, wipe_rows) # takes too long
I = numpy.delete(I, indices).tolist()
J = numpy.delete(J, indices).tolist()
V = numpy.delete(V, indices).tolist()
# Add entry 1.0 to the diagonal for each wipe row
I.extend(wipe_rows)
J.extend(wipe_rows)
V.extend(numpy.ones(len(wipe_rows)))
# construct matrix via coo
Это работает хорошо, но find
стремится занять некоторое время.
Любые подсказки о том, как ускорить это? (Возможно, вытирая строки в СОО или формат CSR является лучшей идеей.)
Это тестирование относительно быстро, особенно если матрица уже 'csr'. – hpaulj