2017-06-25 8 views
0

私は大きな行列(最大百万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の疎なマトリックス形式に変更すると高速になると思いますか?

+0

遅い部分は何ですか?合計?分割?テスト?大きな 'd'では、反復がかなり遅くなることが予想されます。あなたのマトリックスが非常にまばらでない限り(10%以下)、疎なマトリックスは助けにならないでしょう。また、疎行和は密行列を返します。 – hpaulj

答えて

1

NumPy: Return 0 with divide by zero

ゼロオプションによって、様々な分割を論じています。受け入れられた答えはあなたの最初の試みのように多く見えます。かもしれませんが、新しい答えがあります(?)あなたの例では、上で有意義な時間テストを作成するには小さすぎる

https://stackoverflow.com/a/37977222/901925

In [240]: V=A.sum(axis=0) 
In [241]: np.divide(1,V,out=np.zeros(V.shape),where=V>0) 
Out[241]: array([ 0. , 0.5, 0.5, 1. ]) 

速くなります。私は、相対的なスピードについての私のコメントを超えた直感はありません。

最近のSOの質問では、最新のリリース(1.13)でwhereではoutパラメータが必要ですが、それ以前のバージョンではオプションであることが指摘されています。

関連する問題