Как добавить разреженную строку в разреженную матрицу в 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 
  • Внедрение теста Колмогорова Смирнова в python scipy
  • правильное использование scipy.optimize.fmin_bfgs
  • imresize в PIL / scipy.misc работает только для uint8 изображений? любые альтернативы?
  • Как определить, что такое функция распределения вероятности из массива numpy?
  • Какой из них относится к разрезанию столбцов и сортировке строк?
  • Фильтр Scipy с многомерным (или нескалярным) выходом
  • Разбор конкретных столбцов из набора данных в python
  • Вычисление корреляции и значимости Пирсона в Python
  • Python - лучший язык программирования в мире.