разрезать матрицу csr по списку индексов - python - PullRequest
0 голосов
/ 08 марта 2019

Я изо всех сил пытаюсь понять поведение нарезки разреженной матрицы

У меня есть эта матрица csr, скажем M

  (0, 4136)  1
  (0, 5553)  1
  (0, 9089)  1
  (0, 24104) 3
  (0, 28061) 2

Теперь я извлек индекс (столбец), и я хочу нарезать его.Из этой матрицы я хочу матрицу

  (0, 4136)  1
  (0, 5553)  1
  (0, 9089)  1
  (0, 24104) 3

и

   (0, 28061) 2

Теперь, если я сделаю

M[0, training_set_index]

где training_set_index=[4136,5553,9089, 24104], я получу

  (0, 3)    3
  (0, 2)    1
  (0, 1)    1
  (0, 0)    1

Я просто хочу получить копию исходной матрицы (с сохранением индексов) только с индексами, указанными в списке training_set_index.Является ли это возможным?что не так?

Спасибо

1 Ответ

0 голосов
/ 08 марта 2019

Когда я слышу матрицу разреженности - первое, что приходит мне в голову - это множество нулей :)

Один из подходов - преобразовать разреженную матрицу в массив numpy -> сделать какую-нибудь необычную нарезку -> вернуться назадк разреженной матрице:

# create sparse matrix
training_set_index = [5553,24104] # for example I need this index
row = np.array([0, 0, 0, 0, 0])
col = np.array([4136, 5553, 9089, 24104, 28061])
data = np.array([1, 1, 1, 3, 2])
dim_0 = (1,28062)
S = csr_matrix((data, (row, col)), shape=dim_0)

print(S)
#(0, 4136)  1
#(0, 5553)  1
#(0, 9089)  1
#(0, 24104) 3
#(0, 28061) 2

# convert to numpy array
M = S.toarray()

# create np.zeros arrays and fill them with based on training_set_index
x = np.zeros((28061, ),dtype=int)
y = np.zeros((28061, ),dtype=int)
np.add.at(x, training_set_index, M[0,training_set_index])
np.add.at(y, training_set_index, M[0,28061])

# new sparse matrix 
S_training = csr_matrix(x)

print(S_training)
#(0, 5553)  1
#(0, 24104) 3

Приятного нарезки!

...