2012-06-14 2 views
7

Я хотел бы умножить две большие разреженные матрицы. Первый - 150 000 × 300 000, а второй - 300 000 × 300 000. Первая матрица содержит около 1 000 000 ненулевых элементов, а вторая матрица содержит около 20 000 000 ненулевых элементов. Есть ли простой способ получить произведение этих матриц?Умножение больших разреженных матриц в python

Я сейчас храню матрицы в формате csr или csc и пытаюсь matrix_a * matrix_b. Это дает ошибку ValueError: array is too big.

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

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

+0

Какую форму должен иметь результат? – eumiro

+0

@miro: 150 000 на 300 000. Но я ожидаю, что продукт все равно будет скудным. – DanB

ответ

6

Странно, потому что следующие работал для меня:

import scipy.sparse 
mat1 = scipy.sparse.rand(150e3, 300e3, density=1e6/150e3/300e3) 
mat2 = scipy.sparse.rand(300e3, 300e3, density=20e6/150e3/300e3) 
cmat1 = scipy.sparse.csc_matrix(mat1) 
cmat2 = scipy.sparse.csc_matrix(mat2) 
res = cmat1 * cmat2 

Я использую последнюю SciPy. И объем оперативной памяти, используемой python, был ~ 3GB

Итак, может быть, ваши матрицы такие, что их продукт не очень редок?

+0

Первый вызов sparse.rand выше дает мне «ValueError: попытка генерировать случайную разреженную матрицу, такую ​​как произведение размеров, больше, чем 2147483647 - это не поддерживается на этом компьютере». Эта машина работает с 32-разрядным Ubuntu 12.04. – DanB

+1

@DanB: ошибка scipy.sparse.rand является известной проблемой (см. [Здесь] (http://stackoverflow.com/questions/9671150/scipy-large-sparse-matrix)] для работы. – talonmies

+0

Я думаю проблема в 32-битной вашей машине. Использование памяти вашей текущей проблемы умножения матрицы - это несколько концертов, поэтому очень легко попасть в 32-разрядный предел распределения памяти. Поэтому, если вы застряли на 32-битной машине, вы будете нужно делать поэтапное или дисковое умножение, я думаю, –

Смежные вопросы