#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 . Если мне нужно использовать «разреженную» библиотеку, продолжайте и предположите, что это нормально — на самом деле это не имеет отношения к моему вопросу.