Создание разреженной матрицы, содержащей массив - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь построить разреженную матрицу следующим образом:

         0   |   1   |   2   |
0        0   |[1,2,3]|[7,8,9]|
1     [4,5,6]|   0   |   0   |

, используя csr_matrix из scipy.sparse в Python.

Я делаю это следующим образом.Он работает с массивом 1-D.

csr_matrix(([[1,2,3][7,8,9][4,5,6]], ([0,0,1], [1,2,0])), shape=(2,3))

Но у меня есть ошибка ValueError: row, column, and data arrays must be 1-D

Есть ли какой-либо другой пакет, делающий это?

Извините за мой плохой английский.

1 Ответ

0 голосов
/ 04 декабря 2018

Вот bsr представление вашего массива.

Используйте обычную (2,3) csr матрицу, чтобы найти indices и indptr для блоков:

In [335]: M1 = sparse.csr_matrix([[0,1,1],[1,0,0]])
In [336]: M1.A
Out[336]: 
array([[0, 1, 1],
       [1, 0, 0]], dtype=int64)

Определите блоки data.Мне пришлось заказать их в соответствии с макетом M1:

In [337]: data = np.arange(1,10).reshape(3,1,3)[[0,2,1],:]
In [338]: data
Out[338]: 
array([[[1, 2, 3]],

       [[7, 8, 9]],

       [[4, 5, 6]]])

Теперь создайте матрицу bsr:

In [339]: M = sparse.bsr_matrix((data, M1.indices, M1.indptr), shape=(2,9))
In [340]: M
Out[340]: 
<2x9 sparse matrix of type '<class 'numpy.int64'>'
    with 9 stored elements (blocksize = 1x3) in Block Sparse Row format>
In [341]: M.A
Out[341]: 
array([[0, 0, 0, 1, 2, 3, 7, 8, 9],
       [4, 5, 6, 0, 0, 0, 0, 0, 0]])

Она представляет собой матрицу (2,9), но значенияхранятся 3 (1,3) блоков.Для отображения и большинства расчетов он преобразуется в более обычную матрицу csr.

Эта информация также может храниться в виде словаря:

In [349]: adict = {}
In [350]: adict[(0,1)] = data[0]
     ...: adict[(0,2)] = data[1]
     ...: adict[(1,0)] = data[2]
     ...: 
     ...: 
In [351]: adict
Out[351]: 
{(0, 1): array([[1, 2, 3]]),
 (0, 2): array([[7, 8, 9]]),
 (1, 0): array([[4, 5, 6]])}

sparse.dok_matrix также является dictподкласс.Но он не принимает dtype=object, что является единственным способом хранения массивов в качестве элементов.

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