Scipy разреженная матрица становится плотной матрицей после назначения

alpha = csr_matrix((1000,1000),dtype=np.float32)
beta = csr_matrix((1,1000),dtype=np.float32)
alpha[0,:] = beta

После инициации альфа и бета должны быть разреженными матрицами без элементов, сохраненных там. Но после назначения беты первой строке альфа альфа становится не разреженной, и в нём хранится 1000 нулей. Я знаю, что могу использовать remove_zeros (), чтобы превратить альфа обратно в разреженную матрицу, но есть ли лучший способ сделать это?

 hpaulj07 июн. 2016 г., 18:41
Ваш заголовок неверен - это все еще разреженная матрица; это просто не убрано.

Ответы на вопрос(1)

Когда я копирую ваши шаги, я получаю

In [131]: alpha[0,:]=beta
/usr/lib/python3/dist-packages/scipy/sparse/compressed.py:730: 
   SparseEfficiencyWarning: Changing the sparsity structure of a
   csr_matrix is expensive. lil_matrix is more efficient.
   SparseEfficiencyWarning)

Так что это первый показатель того, что вы делаете что-то, что разработчики считают неразумным.

Мы могли бы копаться вcsr __setitem__ код, но я думаю, что это преобразование вашегоbeta чтобы плотно, а затем делать назначение. И не делает автоматическиeliminate_zeros шаг (во время или после назначения).

Обычно, почему люди делаютa[...]=...? Обычно это для построения разреженной матрицы. Обнуление ненулевых значений возможно, но недостаточно часто, чтобы рассматривать его как особый случай.

По разным причинам возможно иметь 0 значений в разреженной матрице. Вы могли бы даже вставить 0 вalpha.data непосредственно. Вот почему существуют такие методы очистки, какeliminate_zeros а такжеprune, Четноеnonzero применяет!=0 маскировать

    # convert to COOrdinate format
    A = self.tocoo()
    nz_mask = A.data != 0
    return (A.row[nz_mask],A.col[nz_mask])

В обычной редкой практике вы строите данные вcoo или другой формат, а затем преобразовать вcsr для расчетов. Умножение матриц - это сильная сторона. Это создает новую разреженную матрицу. Модификацияcsr возможно, но не поощряется

====================

alpha.__setitem__?? (в Ipython) показывает

def __setitem__(self, index, x):
    # Process arrays from IndexMixin
    i, j = self._unpack_index(index)
    i, j = self._index_to_arrays(i, j)

    if isspmatrix(x):
        x = x.toarray()
    ....
    self._set_many(i, j, x.ravel())

Так что да, он преобразует RHS в плотный массив перед выполнением присваивания.

Ваш ответ на вопрос