scipy稀疏矩阵的元素式exp()

7rfyedvj  于 8个月前  发布在  其他
关注(0)|答案(4)|浏览(74)

我有一个非常大的sparse csc_matrixx。我想对它执行elementwise exp()。基本上我想要的是得到与numpy.exp(x.toarray())相同的结果。但我不能这样做(我的记忆不允许我将稀疏矩阵转换为数组)。有什么出路吗?提前感谢!

ki0zmccv

ki0zmccv1#

如果你没有内存来保存x.toarray(),你就没有内存来保存你所要求的输出。输出不会稀疏;事实上,除非你的输入中有负无穷大,否则输出可能不会有一个0。
最好计算exp(x)-1,它就像下面这样简单:

x.expm1()
pxq42qpu

pxq42qpu2#

要更改非零元素,也许这对你有用:

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 )

我一直在纠结如何获取每个非零数组元素的元素级log 2()。最后我做了一个类似的smth:

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

以下两种技术似乎正是我所寻找的。我的矩阵是稀疏的,但它仍然有很多非零元素。
感谢@DSM直接改变x.data的想法,我认为这是关于稀疏矩阵的极好见解。
归功于@Mike Müller使用“out”本身的想法。在同一个线程中,@kmario23指出了一个关于将.data提升为浮点数的重要警告(输入可以是int或smth),因此它与.exp()或任何函数兼容,如果我写的是一般用途的smth,我想这样做。

**注意:**我刚刚开始学习稀疏矩阵,所以想知道这是否是一个坏主意,因为我没有看到原因。请让我知道如果我在薄冰上。

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

au9on6nz

au9on6nz3#

如果你只想在非零上做一些事情:data属性至少在包括csrcsc的某些表示中是可写的。有些表示允许重复的条目,所以要确保你是在一个“标准化”的表单上操作。

mhd8tkvw

mhd8tkvw4#

如果你只想在非零元素上应用一些元素函数,而忽略所有其他压缩的元素(本质上是一个掩码操作),你可以这样做:

y = x.copy()
y.data = np.exp(y.data)

其他元素方面的功能也可以工作。
请注意,这是一个真正的屏蔽操作,而不是将所有其他条目视为0。因为将函数应用于0可能会返回非零值。

相关问题