私は大きな行列(最大百万X百万)を扱っています。行列の各列を列合計し、それぞれの列合計の逆数をそれぞれの列要素ここではゼロ以外の要素があります。私はこれについて2回の試みを行いましたが、まだ高速な計算方法が必要です。また、いくつかの列がゼロであるため、np.reciprocalを直接実行できません。行列の列和と逆数の効率的な方法
A=np.array([[0,1,1,1],[0,0,1,0],[0,1,0,0],[0,0,0,0]])
d=sc.shape(A)[0]
V=sc.zeros(d)
sc.sum(A,axis=0,out=V,dtype='int')
with sc.errstate(divide='ignore', invalid='ignore'):
Vs = sc.true_divide(1, V)
Vs[ ~ sc.isfinite(Vs)] = 0 # -inf inf NaN
print Vs
第二の試み:?私の実行時間が非常に貧弱であるとして
A=np.array([[0,1,1,1],[0,0,1,0],[0,1,0,0],[0,0,0,0]])
d=sc.shape(A)[0]
V=sc.zeros(d)
sc.sum(A,axis=0,out=V,dtype='int')
for i in range(0,d):
if V[i]!=0:
V[i]=1/V[i]
print V
これより速い方法はあり は、ここに私の試みです。 ありがとう
edit1:すべてをcsrの疎なマトリックス形式に変更すると高速になると思いますか?
遅い部分は何ですか?合計?分割?テスト?大きな 'd'では、反復がかなり遅くなることが予想されます。あなたのマトリックスが非常にまばらでない限り(10%以下)、疎なマトリックスは助けにならないでしょう。また、疎行和は密行列を返します。 – hpaulj