Загрузка разреженной матрицы scipy в существующую плотную матрицу - PullRequest
1 голос
/ 28 января 2012

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

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

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

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

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

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

Если она имеет формат CSR:

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 голос
/ 28 января 2012

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

...