2012-01-27 2 views
1

Скажем, у меня огромная матрица numbox A занимает десятки гигабайт. Для выделения этой памяти требуется немалый промежуток времени.Загрузка разреженной матрицы Scipy в существующую матрицу с плотной матрицей

Предположим, у меня также есть коллекция scipy разреженных матриц с теми же размерами, что и матрица numpy. Иногда я хочу преобразовать одну из этих разреженных матриц в плотную матрицу для выполнения некоторых векторизованных операций.

Могу ли я загрузить одну из этих разреженных матриц в A вместо того, чтобы перераспределять пространство каждый раз, когда я хочу преобразовать разреженную матрицу в плотную матрицу? Метод .toarray(), который доступен на scipy разреженных матрицах, похоже, не принимает необязательный аргумент массивного массива, но, возможно, есть и другой способ сделать это.

ответ

2

Если разреженная матрица в формате COO:

def assign_coo_to_dense(sparse, dense): 
    dense[sparse.row, sparse.col] = sparse.data 

Если в формате КСО:

def assign_csr_to_dense(sparse, dense): 
    rows = sum((m * [k] for k, m in enumerate(np.diff(sparse.indptr))), []) 
    dense[rows, sparse.indices] = sparse.data 

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

assert sparse.shape == dense.shape 
dense[:] = 0 
1

Кажется, что должен быть лучший способ сделать это (и я не просмотрел документацию), но вы всегда можете перебирать элементы разреженного массива и назначать плотный массив (возможно, обнуление сначала плотный массив). Если это заканчивается слишком медленно, что кажется, как легко расширение C, чтобы написать ....

+1

It Tu что быстрее преобразовать каждый разреженный массив в плотный массив (что связано с распределением большого количества памяти каждый раз), чем перебирать все элементы разреженного массива и загружать элементы в предопределенный плотный массив. Я не пытался написать расширение C. – conradlee

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