Нарезка разреженных матриц в Scipy - Какие типы работают лучше всего?

SciPyРазреженная Матрица учебник это очень хорошо - но на самом деле он оставляет раздел, посвященный нарезке (разработанным) (все еще в общих чертах - см. раздел: "Обработка разреженных матриц »).

Я постараюсь обновить учебник, как только ответ на этот вопрос.

У меня большая разреженная матрица - в настоящее время в формате dok_matrix.

import numpy as np
from scipy import sparse
M = sparse.dok_matrix((10**6, 10**6))

Для различных методов я хочу иметь возможность разрезать столбцы, а для других я хочу разделять строки. В идеале я бы использовал расширенную индексацию (то есть логический вектор,bool_vect) с которой можно нарезать разреженную матрицуM -- как в:

bool_vect = np.arange(10**6)%2  # every even index
out = M[bool_vect,:]            # Want to select every even row

или же

out = M[:,bool_vect] # Want to select every even column

Во-первых, dok_matrices не поддерживают это - но я думаю, что это работает (медленно), если я сначала приведу к lil_matrices черезsparse.lil_matrix(M)

Насколько я могу понять из учебника - для нарезки столбцов я хочу использовать CSC и для нарезки строк я хочу нарезать CSR. Значит ли это, что я должен разыграть матрицуM с помощью:

M.tocsc()[:,bool_vect]

или же

M.tocsr()[bool_vect,:]

Я вроде как догадываюсь, и мой код из-за этого работает медленно. Любая помощь от кого-то, кто понимает, как это работает, будет оценена. Заранее спасибо.

Если окажется, что я не должен индексировать свою матрицу с помощью логического массива, а скорее список целых чисел (индексов) - это тоже то, что я был бы рад узнать. Что бы ни было более эффективным.

Наконец - это большая матрица, поэтому бонусные баллы, если это может произойти на месте / с трансляцией.

Ответы на вопрос(1)

Ваш ответ на вопрос