Scipy CSR 矩阵逐元素加法
Posted
技术标签:
【中文标题】Scipy CSR 矩阵逐元素加法【英文标题】:Scipy CSR Matrix Element-wise Addition 【发布时间】:2017-07-12 08:53:55 【问题描述】:与 numpy 数组/矩阵不同,CSR 矩阵似乎不允许自动广播。 CSR 实现中有元素乘法的方法,但没有加法。如何通过标量有效地添加到 CSR 稀疏矩阵?
【问题讨论】:
我在***.com/questions/45048431/… 中回答了类似的问题 - 添加一行。添加标量后,矩阵不再是稀疏的;与标量相乘保留了稀疏性(没有新的非零元素)。 有道理。加法应该是这样的,它也更新表示稀疏的整数(通常为 0)。 csr 矩阵上的方法应该在内部处理所有这些。 没有这样的变量。这个包的根源在于线性代数。在此之前,将以代数方式去除线性方程的偏移量。 Panadas 稀疏格式确实允许非零fill
(例如 nan
)。
fill
值为零的假设渗透到计算方法中。特别是乘法假设如果任一参数的元素值为零,则乘积为零,因此它可以走捷径。它只需要使用非零值。 sparse
不仅仅是节省数据存储需求。
【参考方案1】:
在这里,我们想为非零条目添加一个标量,而不管矩阵 稀疏性,即不要触及零条目。
来自fine Scipy docs(** emphasis **
是我的):
Attributes nnz Get the count of explicitly-stored values (nonzeros) has_sorted_indices Determine whether the matrix has sorted indices dtype (dtype) Data type of the matrix shape (2-tuple) Shape of the matrix ndim (int) Number of dimensions (this is always 2) **data CSR format data array of the matrix** indices CSR format index array of the matrix indptr CSR format index pointer array of the matrix
所以我尝试了(第一部分是从参考文档中“偷来的”)
In [18]: from scipy import *
In [19]: from scipy.sparse import *
In [20]: row = array([0,0,1,2,2,2])
...: col = array([0,2,2,0,1,2])
...: data =array([1,2,3,4,5,6])
...: a = csr_matrix( (data,(row,col)), shape=(3,3))
...:
In [21]: a.todense()
Out[21]:
matrix([[1, 0, 2],
[0, 0, 3],
[4, 5, 6]], dtype=int64)
In [22]: a.data += 10
In [23]: a.todense()
Out[23]:
matrix([[11, 0, 12],
[ 0, 0, 13],
[14, 15, 16]], dtype=int64)
In [24]:
它有效。如果您保存原始矩阵,您可以使用构造函数 使用修改后的数据数组。
免责声明
这个答案解决了这个问题的解释
我有一个稀疏矩阵,我想向非零条目添加一个标量,同时保留矩阵及其编程表示的稀疏性。
我选择这种解释的原因是向所有条目添加一个标量会将稀疏矩阵变成一个非常密集的矩阵...
如果这是正确的解释,我不知道:一方面,OP 批准了我的回答(至少今天 2017-07-13),另一方面,在他们问题下方的 cmets 中,他们似乎有不同的意见。
然而,答案在稀疏矩阵表示的用例中很有用,例如,稀疏测量值并且您想要纠正测量偏差、减去平均值等,所以我将把它留在这里,即使它可以被认为是有争议的。
【讨论】:
以上是关于Scipy CSR 矩阵逐元素加法的主要内容,如果未能解决你的问题,请参考以下文章
从 scipy CSR 矩阵索引到 numpy 数组的最有效方法?
python使用scipy中的sparse.csr_matrix函数将numpy数组转化为稀疏矩阵(Create A Sparse Matrix)
python稀疏矩阵得到每列最大k项的值,对list内为类对象的排序(scipy.sparse.csr.csr_matrix)