我正在尝试执行以下操作:
A = scipy.sparse.csr_matrix([0,15,0,0,2,3])
B = scipy.sparse.csr_matrix([1,0,10,0,2,3])
C = operation(A,B)
其中结果应为scipy.sparse.csr_matrix([1,15,10,0,2,3])
简单地说,我想添加两个稀疏矩阵(实际上是向量但是w.e),以便
我目前的表现方式是安静慢,所以我想知道你们是否知道如何快速做到这一点:)
提前致谢!
答案 0 :(得分:1)
鉴于您的示例,您似乎正在寻找矩阵的元素最大值?我不认为有稀疏矩阵的内置方法(使用np.maximum会耗费内存)。
你可以使用等价max(a,b)=(a + b + | a - b |)/ 2
所以:C = (A + B + np.absolute(A - B)) / 2
答案 1 :(得分:0)
我以前能够将update
应用于dok
格式,但现在已被禁用。
我现在能做的最好的事情是:
In [49]: d = dict(A.todok())
In [50]: d.update(B.todok())
In [51]: d
Out[51]: {(0, 0): 1, (0, 1): 15, (0, 2): 10, (0, 4): 2, (0, 5): 3}
但是,我不要随便看一下从这个常规字典中构建dok
词典的快捷方法。 (我必须更多地学习dok
代码。)
coo
格式是构建新矩阵的好格式。不幸的是,它总结了重复。
In [61]: Ac = A.tocoo()
In [62]: Bc = B.tocoo()
In [63]: rows = np.concatenate([Ac.row, Bc.row])
In [64]: cols = np.concatenate([Ac.col, Bc.col])
In [65]: data = np.concatenate([Ac.data, Bc.data])
In [66]: C = sparse.coo_matrix((data,(rows, cols)))
In [67]: C.A
Out[67]: array([[ 1, 15, 10, 0, 4, 6]], dtype=int32)
与(A+B).A
@ p-camilleri的计算可能是最好的:
In [70]: (A + B + np.absolute(A-B))/2
Out[70]:
<1x6 sparse matrix of type '<class 'numpy.float64'>'
with 5 stored elements in Compressed Sparse Row format>
In [71]: _.A
Out[71]: array([[ 1., 15., 10., 0., 2., 3.]])
(_.A
是最后一个结果的数组表示。)