scipy 稀疏矩阵的元素明智的 exp()

Element wise exp() of scipy sparse matrix

我有一个很大稀csc_matrixx。我想对它做 elementwise exp() 。基本上我想要的是获得与 numpy.exp(x.toarray()) 相同的结果。但我不能那样做(我的记忆不允许我将稀疏矩阵转换为数组)。有什么办法吗?提前致谢!

如果您没有内存来保存 x.toarray(),那么您就没有内存来保存您要求的输出。输出不会稀疏;事实上,除非你的输入有负无穷大,否则输出可能不会有一个 0。

计算 exp(x)-1 可能会更好,它和

一样简单
x.expm1()

如果你只想对非零值做一些事情:data 属性至少在某些表示中是可写的,包括 csrcsc。某些表示允许重复条目,因此请确保您在 "normalised" 表格上操作。

要更改 non-zero 元素,也许这对您有用:

x = some big sparse matrix
np.exp( x.data, out=x.data ) # ask np.exp() to store results in existing x.data

大概较慢:

# above seems more efficient (no new memory alloc).
x.data = np.exp( x.data )

我一直在纠结如何获取每个 non-zero 数组元素的 element-wise log2()。我最终做了这样的事:

np.log2( x.data, out=x.data )

以下两种技术似乎正是我所寻找的。我的矩阵很稀疏,但它仍然有很多 non-zero 个元素。

感谢 直接改变 x.data 的想法,我认为这是对稀疏矩阵的极好的见解。

感谢 for the idea of using "out" as itself. In the same thread, 指出了关于将 .data 提升为浮点数(输入可以是 int 或 smth)的重要警告,因此它与 .exp() 或我想做的任何功能兼容如果我写的是一般用途的话。

注意: 我刚刚开始学习稀疏矩阵,所以想知道这是否是个坏主意,原因我没有看到。如果我对此感到如履薄冰,请务必告诉我。

通常我不会弄乱私有属性,但是 .data 在我看过的各种稀疏矩阵的 attributes documentation 中显示得非常清楚。