Пока поэлементная операция не меняет разреженность данных, вы можете использовать атрибут .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
объекты.