Создание большого массива dask, поддерживаемого scipy.sparse.csr_matrix

#python #sparse-matrix #dask

#питон #разреженная матрица #даск

Вопрос:

У меня есть функция, вызовите ее get_block(I, J) , которая принимает два набора индексов, I и J , и возвращает a scipy.sparse.csr_matrix с записями, взятыми из большей разреженной матрицы. Например, get_block(I, J) == S[I, :][:, J] , за исключением того, что S она слишком велика, чтобы поместиться в памяти.

Я хотел бы собрать dask.array версию S использования функции get_block , перебирающую (I, J) пары, соответствующие фрагментам dask. Я хочу создать внешнюю версию S , с которой я смогу вычислять, несмотря на то, что она превышает доступную память. Dask рекламируется как ориентированный на этот вариант использования, поэтому я решил попробовать.

Мне не совсем ясно, как лучше всего это сделать. Кажется, я способен делать подобные вещи:

 block1 = da.from_array(get_block(I, J1))
block2 = da.from_array(get_block(I, J2))
blocked = da.block([block1, block2])
 

Используя этот подход, я мог бы перебрать все (I, J) пары и da.block результат вместе, но это не кажется мне хорошим способом.

Есть ли идиоматический способ сделать это? Является ли dask вообще правильным выбором?

Комментарии:

1. Разреженная матрица не является подклассом ndarray , поэтому dask может не справиться с ней.

2. Данные для csr матрицы хранятся в 3 массивах, атрибутах матрицы. data , indices , и indptr . Матрица scipy.sparse.save_npz сохраняется в виде npz архива, по одному массиву на .npy файл компонента. Посмотрите его код, чтобы увидеть, как они сохраняются и загружаются.

3. У меня не возникает никаких проблем с созданием массива dask из разреженной матрицы scipy. Документы dask утверждают, что поддерживают разреженные массивы: docs.dask.org/en/latest/array-sparse.html . Если мне нужно использовать «разреженную» библиотеку, продолжайте и предположите, что это нормально — на самом деле это не имеет отношения к моему вопросу.