Настройка
In [219]: from scipy import sparse
In [220]: A = sparse.csr_matrix((4,3))
In [221]: A
Out[221]:
<4x3 sparse matrix of type '<class 'numpy.float64'>'
with 0 stored elements in Compressed Sparse Row format>
In [222]: B = sparse.csr_matrix(np.random.rand(2,1))
In [223]: B
Out[223]:
<2x1 sparse matrix of type '<class 'numpy.float64'>'
with 2 stored elements in Compressed Sparse Row format>
In [224]: B.A
Out[224]:
array([[0.04427272],
[0.03421125]])
Ваша попытка, С ОШИБКОЙ
In [225]: A[2:-1, 0] = B
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-225-0dcce4b72635> in <module>
----> 1 A[2:-1, 0] = B
/usr/local/lib/python3.6/dist-packages/scipy/sparse/_index.py in __setitem__(self, key, x)
111 if not ((broadcast_row or x.shape[0] == i.shape[0]) and
112 (broadcast_col or x.shape[1] == i.shape[1])):
--> 113 raise ValueError('shape mismatch in assignment')
114 if x.size == 0:
115 return
ValueError: shape mismatch in assignment
Итак, давайте сосредоточимся на фигурах:
In [226]: A[2:-1, 0].shape
Out[226]: (1, 1)
In [227]: B.shape
Out[227]: (2, 1)
Хорошо Дух! мы не можем поместить (2,1) в (1,1) слот, даже с плотными массивами.
Если мы уроним -1, мы получим слот из 2 элементов:
In [230]: A.A[2:,0].shape
Out[230]: (2,)
Теперь назначение работает - с предупреждением.
In [231]: A[2:, 0] = B
/usr/local/lib/python3.6/dist-packages/scipy/sparse/_index.py:118: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
self._set_arrayXarray_sparse(i, j, x)
In [232]: A
Out[232]:
<4x3 sparse matrix of type '<class 'numpy.float64'>'
with 2 stored elements in Compressed Sparse Row format>
In [233]: A.A
Out[233]:
array([[0. , 0. , 0. ],
[0. , 0. , 0. ],
[0.04427272, 0. , 0. ],
[0.03421125, 0. , 0. ]])
Как правило, мы не создаем разреженные матрицы, присваивая значения существующему «пустому». Мы создаем матрицу csr
со стилями ввода coo
- строка, столбец, массивы данных.