我有一个非常大的sparse csc_matrixx。我想对它执行elementwise exp()。基本上我想要的是得到与numpy.exp(x.toarray())相同的结果。但我不能这样做(我的记忆不允许我将稀疏矩阵转换为数组)。有什么出路吗?提前感谢!
x
numpy.exp(x.toarray())
ki0zmccv1#
如果你没有内存来保存x.toarray(),你就没有内存来保存你所要求的输出。输出不会稀疏;事实上,除非你的输入中有负无穷大,否则输出可能不会有一个0。最好计算exp(x)-1,它就像下面这样简单:
x.toarray()
x.expm1()
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在我看过的各种稀疏矩阵的属性文档中显示得非常清楚。
au9on6nz3#
如果你只想在非零上做一些事情:data属性至少在包括csr和csc的某些表示中是可写的。有些表示允许重复的条目,所以要确保你是在一个“标准化”的表单上操作。
data
csr
csc
mhd8tkvw4#
如果你只想在非零元素上应用一些元素函数,而忽略所有其他压缩的元素(本质上是一个掩码操作),你可以这样做:
y = x.copy() y.data = np.exp(y.data)
其他元素方面的功能也可以工作。请注意,这是一个真正的屏蔽操作,而不是将所有其他条目视为0。因为将函数应用于0可能会返回非零值。
4条答案
按热度按时间ki0zmccv1#
如果你没有内存来保存
x.toarray()
,你就没有内存来保存你所要求的输出。输出不会稀疏;事实上,除非你的输入中有负无穷大,否则输出可能不会有一个0。最好计算exp(x)-1,它就像下面这样简单:
pxq42qpu2#
要更改非零元素,也许这对你有用:
可能更慢:
我一直在纠结如何获取每个非零数组元素的元素级log 2()。最后我做了一个类似的smth:
以下两种技术似乎正是我所寻找的。我的矩阵是稀疏的,但它仍然有很多非零元素。
感谢@DSM直接改变x.data的想法,我认为这是关于稀疏矩阵的极好见解。
归功于@Mike Müller使用“out”本身的想法。在同一个线程中,@kmario23指出了一个关于将.data提升为浮点数的重要警告(输入可以是int或smth),因此它与.exp()或任何函数兼容,如果我写的是一般用途的smth,我想这样做。
**注意:**我刚刚开始学习稀疏矩阵,所以想知道这是否是一个坏主意,因为我没有看到原因。请让我知道如果我在薄冰上。
通常我不会乱用私有属性,但是.data在我看过的各种稀疏矩阵的属性文档中显示得非常清楚。
au9on6nz3#
如果你只想在非零上做一些事情:
data
属性至少在包括csr
和csc
的某些表示中是可写的。有些表示允许重复的条目,所以要确保你是在一个“标准化”的表单上操作。mhd8tkvw4#
如果你只想在非零元素上应用一些元素函数,而忽略所有其他压缩的元素(本质上是一个掩码操作),你可以这样做:
其他元素方面的功能也可以工作。
请注意,这是一个真正的屏蔽操作,而不是将所有其他条目视为0。因为将函数应用于0可能会返回非零值。