В Python и Scipy.sparse, как назначить значение матрицы блоку другой большей матрицы с помощью al oop? - PullRequest
0 голосов
/ 21 апреля 2020

Это для Python 3.x или, более конкретно, Scipy.sparse. Я sh написать

import numpy as np, scipy.sparse as sp

A = sp.csc_matrix((4,3))
B = sp.csc_matrix(np.random.rand(2,1))
A[2:-1,0] = B

Последняя строка не работает. Я намереваюсь вставить последнюю строку в матрицу B в качестве блока со строкой 3 в строку 4 и столбец 0. Как правильно выполнить это назначение без al oop?

1 Ответ

1 голос
/ 21 апреля 2020

Настройка

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 - строка, столбец, массивы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...