次のような状況があります。
同じ形状の 2 つの csr_matrics (ベクトルの形式) があり、ベクトル v の対応する値がゼロでない場合、ベクトル u の値を置き換えたいと考えています。
そう:
u[i,0] = v[i,0] iff v[i,0] is not zero
もちろん、全体をループすることもできますが、全体を高速化する、より Pythonic な解決策が必要だと考えていました。
ありがとう
次のような状況があります。
同じ形状の 2 つの csr_matrics (ベクトルの形式) があり、ベクトル v の対応する値がゼロでない場合、ベクトル u の値を置き換えたいと考えています。
そう:
u[i,0] = v[i,0] iff v[i,0] is not zero
もちろん、全体をループすることもできますが、全体を高速化する、より Pythonic な解決策が必要だと考えていました。
ありがとう
あなたが得られる最善の方法はおそらくこれだと思いますが、これは の希薄パターンに新しい値を追加するものではありませu
ん(u[i,j] is nonzero) and (v[i,j] != 0
。
if not isinstance(u, csr_matrix):
raise ValueError
# make sure that data is as expected. I hope this is all thats necessary. Not sure when it is necessary:
u.sum_duplicates()
col = np.arange(u.shape[0]).repeat(np.diff(u.indptr))
row = u.indices
# You could mask out specific rows/columns here too I guess
new_data = v[row, col]
new_data = np.asarray(new_data).squeeze() # probably not necessary, but doesn't hurt too
mask = new_data != 0
np.putmask(u.data, mask, new_data)
# or if you prefere, but a bit slower for the putmask call:
u.data[mask] = new_data[mask]
申し訳ありませんが、少し前後していたので、まだ何かが正しくない場合があります。もっときちんとした解決策があることを願っています...