Вопрос по indexing, scipy, python, slice, sparse-matrix – Нарезка разреженных матриц в Scipy - Какие типы работают лучше всего?

23

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   ответ
39

Хорошо, яЯ уверен, что "право" Это можно сделать следующим образом: если вы разрезаете столбцы, используйте tocsc () и slice, используя список / массив целых чисел. Булевы векторы, похоже, не справляются с разреженными матрицами - так же, как с ndarrays в numpy. Что означает ответ.

indices = np.where(bool_vect)[0]
out1 = M.tocsc()[:,indices]
out2 = M.tocsr()[indices,:]

Но вопрос: это лучший способ? Это на месте?

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

ЕслиM это формат, который не имеет индексации (coo или жеdok) тогда это обращение - правильный путь. Но еслиM ужеcsr переключение наcsc просто индексирование столбцов может не стоить того.sparse индексация - сложный бизнес. hpaulj

Похожие вопросы