Я использую 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, которые упоминают треугольные матрицы, но они, кажется, вращаются вокруг получения треугольных матриц от полной матрицы. В моем случае, (я думаю) я уже имею треугольную матрицу и хочу управлять им.
Большое спасибо.
Я бы сказал, что нельзя получить торт и съесть его тоже: если вы хотите эффективное хранение, вы не можете хранить полные строки (как вы говорите); если вы хотите эффективный доступ к строкам, я бы сказал, что вы должны хранить полные строки.
Хотя реальная производительность зависит от вашего приложения, вы можете проверить, работает ли для вас следующий подход:
Вы используете разреженные матрицы Scipy для эффективного хранения.
Вы автоматически симметризируете свою матрицу (на StackOverflow есть небольшой рецепт, который работает, по крайней мере, для обычных матриц).
Затем вы можете получить доступ к ее строкам (или столбцам); будет ли это эффективно, зависит от реализации разреженных матриц...