Вы можете изменить атрибут data
напрямую:
>>> a = np.array([[5,0,0,0,0,0,0],[0,0,0,0,2,0,0]])
>>> coo = coo_matrix(a)
>>> coo.data
array([5, 2])
>>> coo.data = np.log(coo.data)
>>> coo.data
array([ 1.60943791, 0.69314718])
>>> coo.todense()
matrix([[ 1.60943791, 0. , 0. , 0. , 0. ,
0. , 0. ],
[ 0. , 0. , 0. , 0. , 0.69314718,
0. , 0. ]])
Обратите внимание, что это не работает должным образом, если в разреженном формате есть повторяющиеся элементы (что допустимо в формате COO);журналы будут приниматься индивидуально и log(a) + log(b) != log(a + b)
.Вы, вероятно, хотите сначала преобразовать в CSR или CSC (что быстро), чтобы избежать этой проблемы.
Вам также, конечно, придется добавить проверки, если разреженная матрица находится в другом формате.И если вы не хотите изменять матрицу на месте, просто создайте новую разреженную матрицу, как вы это сделали в своем ответе, но без добавления 3
, потому что здесь это совершенно не нужно.