在稀疏numpy 2D阵列上优化每元素操作

在稀疏numpy 2D阵列上优化每元素操作,numpy,matrix,vectorization,sparse-matrix,Numpy,Matrix,Vectorization,Sparse Matrix,我需要一个99.9%的大稀疏2D矩阵上的M=np.log(1+M) 如何有效地执行此操作 x,y=M.nonzero()将检索非零元素的坐标对,但是我可以对这些坐标对进行log操作向量化吗 numpy似乎没有稀疏的支持。这是最简单的: import numpy as np import scipy.sparse as sps M = sps.csr_matrix(M) M.data += 1 M.data = np.log(M.data) 如果它特别大,您也可以将其记录在适当的位置(这会阻

我需要一个99.9%的大稀疏2D矩阵上的
M=np.log(1+M)

如何有效地执行此操作

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

numpy似乎没有稀疏的支持。

这是最简单的:

import numpy as np
import scipy.sparse as sps

M = sps.csr_matrix(M)

M.data += 1
M.data = np.log(M.data)
如果它特别大,您也可以将其记录在适当的位置(这会阻止上面的完整副本):

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

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

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

scipy
有一个
sparse
模块。但是我不会仅仅为了这个
log
而使用它,也许还可以演示如何在适当的位置执行日志:
M.data=np.log(M.data,out=M.data)
这里不需要分块。@max9111哦,好主意-我不知道你可以给
out
相同的数组。注意numpy有
log1p
(日志一加)
M = np.add(M, 1, out=M, where=M!=0)
M = np.log(M, out=M, where=M!=0)