将csr_matrix的行中的零元素替换为向量中的条目

时间:2016-05-20 08:14:47

标签: python-3.x scipy sparse-matrix

我有一个sparse.csr_matrix M和一个以下维度的向量V.

M: 0.15M x 1.3M
V: 0.15M

我想用M中的相应条目替换M行中的所有0个元素。

M = [[0, 1, 2],
     [3, 4, 0],
     [6, 0, 8]]
V = [[11],
     [22],
     [33]]

我想将M修改为M',以便

M = [[11,  1,  2],
     [ 3,  4, 22],
     [ 6, 33,  8]]

这可以很容易地在循环中完成,但我想知道是否有更优雅的Python方式。由于我的数据非常庞大,我正在寻找一种非常快速的方法来完成这项任务。

循环版本如下:

for i in range(0,3):
    for j in range(0,3):
        if M[i,j] == 0 and V[i] !=0:
            M[i,j] = V[i]

1 个答案:

答案 0 :(得分:1)

这里应该是快速的,并且在不使M密集的情况下工作。结果虽然很密集。

没有办法解决这个问题

V展开为与M

相同大小的矩阵
In [711]: Z = np.repeat(V,M.shape[1],axis=1)

In [712]: idx=M.nonzero()   

In [713]: Z[idx]=M.data

In [714]: Z
Out[714]: 
array([[11,  1,  2],
       [ 3,  4, 22],
       [ 6, 33,  8]])

它找到M的所有非零值的位置(基本上是row的{​​{1}}和col属性。然后只需替换M.tocoo() fill中的值与来自Z的相应data值。

如果M尚未修剪,则会失败;其中一些元素已设置为零。那是因为M的完整代码是:

M.nonzero

使用

可能更安全
    A = self.tocoo()
    nz_mask = A.data != 0
    return (A.row[nz_mask],A.col[nz_mask])

这可以防止在从In [717]: Mc=M.tocoo() In [718]: Z[Mc.row, Mc.col] = Mc.data In [719]: Z Out[719]: array([[11, 1, 2], [ 3, 4, 22], [ 6, 33, 8]]) 转换为datacsr重新排序。