Загрузка разреженной матрицы 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 для написания....