Как добавить разреженную строку в разреженную матрицу в Python?

Эта задача довольно простая в NumPy, например, так

import numpy as np a= np.array([[1,2,3,0,9],[3,2,6,2,7],[0,0,0,8,0],[1,0,0,0,3]]) a + a[1] 

Вывод:

 array([[ 4, 4, 9, 2, 16], [ 6, 4, 12, 4, 14], [ 3, 2, 6, 10, 7], [ 4, 2, 6, 2, 10]]) 

Посмотрите, как векторные размеры автоматически передаются в каждую строку матрицы.

Но когда дело доходит до разреженных матриц, возникает ошибка несоответствия размеров.

 from scipy.sparse import * a= csr_matrix([[1,2,3,0,9],[3,2,6,2,7],[0,0,0,8,0],[1,0,0,0,3]]) a + a[1] 

Вывод:

 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-32-74c48fe5106e> in <module>() 2 3 a= csr_matrix([[1,2,3,0,9],[3,2,6,2,7],[0,0,0,8,0],[1,0,0,0,3]]) ----> 4 a + a[1] /opt/anaconda2/lib/python2.7/site-packages/scipy/sparse/compressed.pyc in __add__(self, other) 337 elif isspmatrix(other): 338 if (other.shape != self.shape): --> 339 raise ValueError("inconsistent shapes") 340 341 return self._binopt(other,'_plus_') ValueError: inconsistent shapes 

Существует функция для разреженного умножения, например, a.multiply(a[1]) для a * a[1] (что делает его работу отлично), но я не смог найти ее для добавления.

Я новичок в разреженных матрицах. Пожалуйста помоги.

2 Solutions collect form web for “Как добавить разреженную строку в разреженную матрицу в Python?”

для редких матриц не реализовано широковещательное вещание типа numpy .

Умножение, особенно матричное умножение, хорошо развито. Фактически такие действия, как сумма строк и выбор строк, реализуются как умножения матриц – например, M * <column vector of 1s> . Умножение часто приводит к матрице, которая столь же разрежена, если не больше.

Сложение / вычитание недостаточно развито. Это часто приводит к более плотной матрице. Крайний случай – добавление скаляра ко всем элементам. В вашем примере результат плотный. Оба a и a[1,:] должны быть довольно разрежены, чтобы оправдать чистое разреженное дополнение.

 In [713]: a= np.array([[1,2,3,0,9],[3,2,6,2,7],[0,0,0,8,0],[1,0,0,0,3]]) In [714]: aM = sparse.csr_matrix(a) In [715]: aM Out[715]: <4x5 sparse matrix of type '<class 'numpy.int32'>' with 12 stored elements in Compressed Sparse Row format> 

Мы можем реплицировать выбранную строку с помощью матричного умножения – сначала широковещательный плотный подход:

 In [719]: np.ones((4,1))*aM[1,:] Out[719]: array([[ 3., 2., 6., 2., 7.], [ 3., 2., 6., 2., 7.], [ 3., 2., 6., 2., 7.], [ 3., 2., 6., 2., 7.]]) In [720]: np.ones((4,1))*aM[1,:]+aM # dense matrix addition Out[720]: matrix([[ 4., 4., 9., 2., 16.], [ 6., 4., 12., 4., 14.], [ 3., 2., 6., 10., 7.], [ 4., 2., 6., 2., 10.]]) 

разреженное матричное умножение:

 In [721]: sparse.csr_matrix(np.ones((4,1)))*aM[1,:] Out[721]: <4x5 sparse matrix of type '<class 'numpy.float64'>' with 20 stored elements in Compressed Sparse Row format> 

разреженная матрица:

 In [722]: sparse.csr_matrix(np.ones((4,1)))*aM[1,:]+aM Out[722]: <4x5 sparse matrix of type '<class 'numpy.float64'>' with 20 stored elements in Compressed Sparse Row format> In [723]: _.A Out[723]: array([[ 4., 4., 9., 2., 16.], [ 6., 4., 12., 4., 14.], [ 3., 2., 6., 10., 7.], [ 4., 2., 6., 2., 10.]]) 

Это было бы лучшей демонстрацией, если бы aM и особенно aM[1:] были разрежены. Я мог бы также указать np.ones как int dtype для соответствия aM . И сделать его csc матрицей было бы более компактным.

Попробуйте:

 from scipy.sparse import * a= csr_matrix([[1,2,3,0,9],[3,2,6,2,7],[0,0,0,8,0],[1,0,0,0,3]]) a.todense()+a[1].todense() 

это будет:

 matrix([[ 4, 4, 9, 2, 16], [ 6, 4, 12, 4, 14], [ 3, 2, 6, 10, 7], [ 4, 2, 6, 2, 10]]) 

Обновить:

Создайте матрицу сложения b с одинаковым размером и заполните с a[1] , а затем добавьте их:

 from scipy.sparse import * import numpy as np an_array=np.array([[1,2,3,0,9],[3,2,6,2,7],[0,0,0,8,0],[1,0,0,0,3]]) a = csr_matrix(an_array) b = csr_matrix([an_array[1] for i in range(len(an_array))]) a+b 
  • Учитывая матрицу типа `scipy.sparse.coo_matrix`, как определить индекс и значение максимума каждой строки?
  • Изменение структуры массива numpy, обеспечивающего заданное значение
  • Как указать верхний и нижний пределы при использовании numpy.random.normal
  • Чтение файлов MatLab в python w / scipy
  • Линейная регрессия массивов, содержащих NAN в Python / Numpy
  • Лучший способ масштабирования матричных переменных в схеме линейного программирования SCIPY
  • Как преобразовать numpy.matrix или массив в scipy разреженную матрицу
  • numpy matrix trickery - сумма матриц обратных времен
  • Импортирование многопроцессорных прерываний в Python
  • Scipy / Numpy FFT Frequency Analysis
  • Совместное использование массивов numpy в пуле многопроцессорности python
  • Python - лучший язык программирования в мире.