Отбор нескольких рядов скудной разреженной матрицы в другую - PullRequest
0 голосов
/ 26 мая 2018

Как я могу выбрать несколько строк скудной разреженной матрицы и сформировать новую скудную разреженную матрицу из этих выбранных строк?

Например, например.если у меня скудная разреженная матрица A с 10 строками, и я хочу создать новую скудную разреженную матрицу B со строками 1,3,4 от A, как это сделать?

1 Ответ

0 голосов
/ 26 мая 2018

Умножение влево с соответствующей матрицей индикатора.Матрица индикатора может быть построена с использованием scipy.sparse.block_diag или напрямую, используя формат csr, как показано ниже.

>>> import numpy as np
>>> from scipy import sparse
>>> 
# create example
>>> m, n = 10, 8
>>> subset = [1,3,4]
>>> A = sparse.csr_matrix(np.random.randint(-10, 5, (m, n)).clip(0, None))
>>> A.A
array([[3, 2, 4, 0, 0, 0, 2, 0],
       [0, 0, 2, 0, 0, 0, 0, 0],
       [4, 0, 0, 0, 0, 2, 0, 0],
       [0, 0, 0, 0, 0, 0, 4, 0],
       [3, 0, 0, 0, 1, 4, 0, 0],
       [0, 0, 0, 0, 0, 0, 2, 0],
       [0, 0, 0, 4, 0, 4, 4, 0],
       [0, 2, 0, 0, 0, 3, 0, 0],
       [4, 0, 3, 3, 0, 0, 0, 2],
       [4, 0, 0, 0, 0, 2, 0, 1]], dtype=int64)
>>>
# build indicator matrix
# either using block_diag ...
>>> split_points = np.arange(len(subset)+1).repeat(np.diff(np.concatenate([[0], subset, [m-1]])))
>>> indicator = sparse.block_diag(np.split(np.ones(len(subset), int), split_points)).T
>>> indicator.A
array([[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0, 0]], dtype=int64)
>>>
# ... or manually---this also works for non sorted non unique subset,
# and is therefore to be preferred over block_diag
>>> indicator = sparse.csr_matrix((np.ones(len(subset), int), subset, np.arange(len(subset)+1)), (len(subset), m))
>>> indicator.A
array([[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0, 0]])
>>> 
# apply
>>> result = indicator@A
>>> result.A
array([[0, 0, 2, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 4, 0],
       [3, 0, 0, 0, 1, 4, 0, 0]], dtype=int64)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...