优化稀疏 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)
我需要 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)