2

次のような状況があります。

同じ形状の 2 つの csr_matrics (ベクトルの形式) があり、ベクトル v の対応する値がゼロでない場合、ベクトル u の値を置き換えたいと考えています。

そう:

u[i,0] = v[i,0] iff v[i,0] is not zero

もちろん、全体をループすることもできますが、全体を高速化する、より Pythonic な解決策が必要だと考えていました。

ありがとう

4

1 に答える 1

0

あなたが得られる最善の方法はおそらくこれだと思いますが、これは の希薄パターンに新しい値を追加するものではありませ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]

申し訳ありませんが、少し前後していたので、まだ何かが正しくない場合があります。もっときちんとした解決策があることを願っています...

于 2012-10-16T22:42:33.073 に答える