Поэлементные операции над scipy.sparse.coo_matrix (например, по модулю)? - PullRequest
0 голосов
/ 11 октября 2019

Как я могу выполнять поэлементные операции (например, по модулю) для scipy.sparse.coo_matrix ?

Нужно ли создавать из него плотный массив NumPy? Если это так, не потеряю ли я все выгоды от создания разреженной матрицы?

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Пока поэлементная операция не меняет разреженность данных, вы можете использовать атрибут .data, например:

import scipy as sp
import scipy.sparse


m = (sp.sparse.rand(5, 10, 0.2) * 100).astype(int)
print(m)
  (1, 0)        34
  (1, 2)        2
  (2, 2)        39
  (1, 4)        54
  (3, 4)        22
  (4, 4)        46
  (1, 6)        40
  (1, 7)        97
  (4, 8)        60
  (4, 9)        97
m.data %= 10
print(m)
  (1, 0)        4
  (1, 2)        2
  (2, 2)        9
  (1, 4)        4
  (3, 4)        2
  (4, 4)        6
  (1, 6)        0
  (1, 7)        7
  (4, 8)        0
  (4, 9)        7

Этодолжно быть эффективным и не должно иметь никаких преобразований служебных данных.

Обратите внимание, что это можно сделать для любой операции, для которой ноль 0 является поглощающим элементом , впо крайней мере, с одной стороны (слева или справа) для несимметричных (коммутативных) операций.

Например, в операции по модулю %, 0 является левопоглощающим элементом, поскольку 0 % a = 0 длялюбой a. То же самое верно для целочисленного деления //, деления / (при условии, что различие 0.0 и -0.0 не требуется) и возведения в степень ** (для положительных чисел). Для умножения *, 0 является поглощающим элементом.

Для случая поэлементного умножения * и / (по крайней мере, для скаляра) поддерживаются с обычным синтаксисом: scipy.sparse.coo_matrix объекты.

1 голос
/ 11 октября 2019

Удивительно, но это не просто sparse_input % whatever. Это не поддерживаетсяВместо этого для скалярной RHS вы можете напрямую манипулировать форматом COO:

coo_lhs = whatever
scalar_rhs = whatever
coo_result = scipy.sparse.coo_matrix(
    (coo_lhs.data % scalar_rhs, (coo_lhs.row.copy(), coo_lhs.col.copy())),
    shape=coo_lhs.shape)

Нет смысла иметь разреженную матрицу в качестве RHS для операции по модулю - если вы уверены, что хотитечто, конвертировать в плотный.

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