Scipy редкая треугольная матрица?

Я использую Scipy для построения большого, редкого (250k X 250k) использование матрицы совместной встречаемости scipy.sparse.lil_matrix. Матрицы совместной встречаемости являются треугольными; то есть, M [я, j] == M [j, я]. Так как это было бы очень неэффективно (и в моем случае, невозможно) хранить все данные дважды, я в настоящее время храню данные в координате (я, j), где я всегда меньше, чем j. Так, другими словами, мне сохранили значение в (2,3) и никакое значение, сохраненное в (3,2), даже при том, что (3,2) в моей модели должно быть равно (2,3). (См. матрицу ниже для примера),

Моя проблема состоит в том, что я должен смочь случайным образом извлечь данные, соответствующие данному индексу, но, по крайней мере, путь, я в настоящее время делаю их, половина данных находится в строке, и половина находится в столбце, как так:

M = 
    [1 2 3 4
     0 5 6 7
     0 0 8 9
     0 0 0 10]

Так, данный вышеупомянутую матрицу, я хочу смочь сделать запрос как M[1], и возвратитесь [2,5,6,7]. У меня есть два вопроса:

1) Существует ли более эффективное (предпочтительно встроено) способ сделать это, чем первые запросы строки, и затем столбца и затем конкатенации двух? Это плохо, потому что, использую ли я (основанный на столбце) CSC или CSR (находящееся на строке) внутреннее представление, один из двух запросов очень неэффективен.

2) Я даже использую правильную часть Scipy? Я видел несколько функций в библиотеке Scipy, которые упоминают треугольные матрицы, но они, кажется, вращаются вокруг получения треугольных матриц от полной матрицы. В моем случае, (я думаю) я уже имею треугольную матрицу и хочу управлять им.

Большое спасибо.

8
задан gilesc 24 June 2010 в 04:11
поделиться

1 ответ

Я бы сказал, что нельзя получить торт и съесть его тоже: если вы хотите эффективное хранение, вы не можете хранить полные строки (как вы говорите); если вы хотите эффективный доступ к строкам, я бы сказал, что вы должны хранить полные строки.

Хотя реальная производительность зависит от вашего приложения, вы можете проверить, работает ли для вас следующий подход:

  1. Вы используете разреженные матрицы Scipy для эффективного хранения.

  2. Вы автоматически симметризируете свою матрицу (на StackOverflow есть небольшой рецепт, который работает, по крайней мере, для обычных матриц).

  3. Затем вы можете получить доступ к ее строкам (или столбцам); будет ли это эффективно, зависит от реализации разреженных матриц...

1
ответ дан 6 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

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