我有一个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]
答案 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]])
转换为data
时csr
重新排序。