Загрузка разреженной матрицы scipy в существующую плотную матрицу

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

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

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

2 ответа

Решение

Если разреженная матрица имеет формат 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

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

Другие вопросы по тегам