Python如何做这个scipy稀疏矩阵的补充?

时间:2018-02-12 08:46:01

标签: python numpy scipy sparse-matrix

我正在尝试执行以下操作:

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),以便

  1. 如果A [i] == B [i]则C [i] = A [i] = B [i];
  2. 如果A [i] == 0且B [i]!= 0则C [i] = B [i];
  3. 如果A [i]!= 0且B [i] == 0则C [i] = A [i]
  4. 我目前的表现方式是安静慢,所以我想知道你们是否知道如何快速做到这一点:)

    提前致谢!

2 个答案:

答案 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是最后一个结果的数组表示。)