优化稀疏 numpy 二维数组上的每个元素操作

Optimize per-element operation on sparse numpy 2D array

我需要 M = np.log(1+M) 一个大的 99.9% 稀疏二维矩阵。

如何有效地执行此操作?

x, y = M.nonzero() 将检索非零元素的坐标对,但我可以对这些对进行矢量化 log 操作吗?

numpy 似乎没有 sparse 支持。

这是最简单的:

import numpy as np
import scipy.sparse as sps

M = sps.csr_matrix(M)

M.data += 1
M.data = np.log(M.data)

如果它特别大,您也可以将其记录到位(这会阻止上面的完整复制):

M.data += 1
M.data=np.log(M.data,out=M.data)

这两个选项都适用于密集矩阵,只需稍作改动 - 如果您的矩阵是 99.9% 稀疏的,我会开始使用实际的稀疏数据结构。

您也可以在密集数组上使用 where 参数,但我怀疑它实际上会更快:

M = np.add(M, 1, out=M, where=M!=0)
M = np.log(M, out=M, where=M!=0)