Мне нужно итеративно построить огромную разреженную матрицу в numpy/scipy. Intitialization выполняется в цикле:Огромная разреженная матрица в python
from scipy.sparse import dok_matrix, csr_matrix
def foo(*args):
dim_x = 256*256*1024
dim_y = 128*128*512
matrix = dok_matrix((dim_x, dim_y))
for i in range(dim_x):
# compute stuff in order to get j
matrix[i, j] = 1.
return matrix.tocsr()
Тогда мне нужно, чтобы преобразовать его в csr_matrix, из-за дальнейших вычислений, таких как:
matrix = foo(...)
result = matrix.T.dot(x)
В начале это работало отлично. Но мои матрицы становятся все больше и больше, и мой компьютер начинает крутиться. Есть ли более элегантный способ хранения матрицы?
В принципе у меня есть следующие требования:
- Матрица должна хранить значения с плавающей точкой формы 0. до 1.
- мне нужно вычислить транспонирование матрицы
- Мне нужно вычислить Скалярное произведение с вектором x_dimensional
- размеры матрицы может быть около 1 * 10^9 х 1 * 10^8
Мой набегающего хранение превышает. Я читал несколько сообщений о переполнении стека и остальной части Интернета;) Я нашел PyTables, который на самом деле не сделан для матричных вычислений ... и т. Д. Есть ли лучший способ?
Я думаю, что это может быть скорее вопрос математического/численного анализа :) В моем Num.Anal. Конечно, единственный способ сделать матрицу такого размера - сделать ее тридиагональной. –
Кроме того, я знаю, что вы запрашиваете numpy, но у меня есть немного законченная библиотека для python. [Это на github] (https: // github.com/Twoody/Lin_Alg_py) –
Когда вы задали этот вопрос, оказалось, что вы хотите хранить поплавки, но вы приняли ответ, который предложил ints. Мне просто интересно - чего я здесь пропустил? Благодаря! –