Scipy稀疏矩阵的按元素exp()函数

4

我有一个非常大的 sparse csc_matrix x。我想对它进行逐个元素的 exp() 运算。基本上,我想得到的结果与 numpy.exp(x.toarray()) 相同。但是我无法这样做(我的内存无法将稀疏矩阵转换成数组)。有什么办法吗?提前感谢!


1
如果你不能以密集格式保存输入,那么你也无法保存输出;因为e^0=1,所以输出不会是稀疏的。 - user2357112
4个回答

8
如果你没有足够的内存来存储, 那么你也没有足够的内存来存储你所要求的输出结果。输出结果不会是稀疏的;事实上,除非您的输入中有负无穷大的值,否则输出结果可能不会有一个单独的0。
计算exp(x)-1可能会更好,这很简单。
x.expm1()

是的,你说得对。但是,我怎么只针对非零值做呢? - Bishwajit Purkaystha
1
那是什么?稀疏矩阵包含所有将零映射为成员的numpy函数?这是一个我没有预料到的特性! - Paul Panzer
是的,scipy/sparse/data.py 有一段代码 # Add the numpy unary ufuncs for which func(0) = 0 to _data_matrix.。关键是能够访问 .data 属性,并使用 _with_data 方法创建一个新矩阵。我之前也不知道这一点。 - hpaulj

4

如果你想改变非零元素,也许这个方法适合你:

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 )

我一直在思考如何对每个非零数组元素进行逐元素的log2()运算。最终我做了以下操作:

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

以下两种技术看起来正是我需要的。我的矩阵是稀疏的,但仍有很多非零元素。
感谢@DSM 直接更改 x.data 的想法,我认为这是关于稀疏矩阵的绝妙见解。
感谢@Mike Müller 提出使用 "out" 作为本身的想法。在同一线程中,@kmario23 指出了一个重要的警告,即将 .data 提升为浮点数(输入可能是 int 或其他类型),以便与 .exp() 或任何函数兼容。如果我编写用于通用用途的代码,我会这样做。
注意:我刚开始学习稀疏矩阵,所以想知道这是否是一个不好的想法,因为我没有看到的原因。如果我在这方面存在问题,请务必让我知道。

通常情况下我不会去操作私有属性,但是在我查看的各种稀疏矩阵的属性文档中,.data 属性非常明显。


3

如果您只想针对非零元素进行操作:在某些表示中,包括 csrcscdata 属性是可写的。一些表示允许重复条目,请确保您正在处理“规范化”形式。


是的,这正是我想的。不管怎样,我会开始动手做! - Bishwajit Purkaystha

0
如果你只想对非零元素应用逐元素函数,并忽略所有其他压缩元素(实质上是一种掩码操作),你可以这样做:
y = x.copy()
y.data = np.exp(y.data)

其他逐元素函数也可以起作用。
请注意,这是一个真正的“掩码”操作,而不是将所有其他条目视为0。因为对0应用函数可能会返回非零值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接