NumPy矩阵到SciPy稀疏矩阵:添加标量的最安全方法是什么?

NumPy矩阵到SciPy稀疏矩阵:添加标量的最安全方法是什么?,numpy,matrix,scipy,sparse-matrix,Numpy,Matrix,Scipy,Sparse Matrix,首先,我不是数学家。我承认。然而,我仍然需要理解ScyPy的稀疏矩阵是如何在算术上工作的,以便在我必须处理的应用程序中从稠密NumPy矩阵切换到SciPy稀疏矩阵。问题是内存使用。大型密集矩阵将消耗大量内存 有争议的公式部分是将矩阵添加到标量中 A = V + x 式中,V是一个正方形矩阵(其较大,例如60000 x 60000),且人口稀少。x是一个浮点数 使用NumPy的操作将(如果我没有弄错的话)将x添加到V中的每个字段。如果我完全偏离基准,请告诉我,x将只添加到V中的非零值 对于Sci

首先,我不是数学家。我承认。然而,我仍然需要理解ScyPy的稀疏矩阵是如何在算术上工作的,以便在我必须处理的应用程序中从稠密NumPy矩阵切换到SciPy稀疏矩阵。问题是内存使用。大型密集矩阵将消耗大量内存

有争议的公式部分是将矩阵添加到标量中

A = V + x
式中,V是一个正方形矩阵(其较大,例如60000 x 60000),且人口稀少。x是一个浮点数

使用NumPy的操作将(如果我没有弄错的话)将x添加到V中的每个字段。如果我完全偏离基准,请告诉我,x将只添加到V中的非零值

对于SciPy,并非所有稀疏矩阵都支持相同的功能,如标量加法。dok_矩阵(键字典)支持标量加法,但(在实践中)它似乎在分配每个矩阵项,有效地将我的稀疏dok_矩阵呈现为一个密集矩阵,开销更大。(不好)

其他矩阵类型(CSR、CSC、LIL)不支持标量加法

我可以尝试用标量值x构造一个完整的矩阵,然后将其添加到V中。矩阵类型不会有问题,因为它们似乎都支持矩阵加法。然而,我必须消耗大量内存才能将x构造成一个矩阵,并且加法的结果也可能最终被完全填充到矩阵中

必须有一种替代方法来实现这一点,它不需要分配100%的稀疏矩阵


我愿意接受需要大量内存的事实,但我想我会先寻求一些建议。谢谢。

诚然,稀疏矩阵并不在我的驾驶室中,但ISTM的最佳前进方式取决于矩阵类型。如果你是DOK:

>>> S = dok_matrix((5,5))
>>> S[2,3] = 10; S[4,1] = 20
>>> S.todense()
matrix([[  0.,   0.,   0.,   0.,   0.],
        [  0.,   0.,   0.,   0.,   0.],
        [  0.,   0.,   0.,  10.,   0.],
        [  0.,   0.,   0.,   0.,   0.],
        [  0.,  20.,   0.,   0.,   0.]])
然后您可以更新:

>>> S.update(zip(S.keys(), np.array(S.values()) + 99))
>>> S
<5x5 sparse matrix of type '<type 'numpy.float64'>'
    with 2 stored elements in Dictionary Of Keys format>
>>> S.todense()
matrix([[   0.,    0.,    0.,    0.,    0.],
        [   0.,    0.,    0.,    0.,    0.],
        [   0.,    0.,    0.,  109.,    0.],
        [   0.,    0.,    0.,    0.,    0.],
        [   0.,  119.,    0.,    0.,    0.]])
请注意,您可能需要添加一个额外的

>>> C.eliminate_zeros()

为了处理你添加了一个负数的可能性,现在有一个
0
,它实际上正在被记录。就其本身而言,这应该可以很好地工作,但下次您执行
C.data+=some_number
技巧时,它会将
some number
添加到您引入的零上。

只是要明确一点:最后,您想要的结果是密集矩阵
A
?或者您想将标量
x
添加到
V
的非零元素中吗?“直接修改数据属性”谢谢,这是一个极好的见解。
>>> C.eliminate_zeros()