2017-05-30 16 views
0

numpyでコードを最適化しようとしていますが、これが正しいアプローチであるかどうかは疑問です。計算の適切な最適化

ここで計算の式は です。この行列は下三角です。

1

そして、ここに私の試みです:

(np.sum(P) - np.trace(P))/np.sum(((t[np.newaxis]).T - t) * P) 

それが得ることができるか、より効率的な方法を見ることができるように良い本ですか?

+2

'p'と' P'があるようです。それは意図されているのですか? – Divakar

+0

Divakarありがとう、それはタイプミス(編集)だった。私はその部分(t [np.newaxis])を心配しています。別のn * n行列を作成すると思いますが、それは間違いですか?したがって、この場合、簡潔さは適切なアプローチですか、そうではありませんか? –

+1

答えを書くつもりがない限り、Code Reviewはお勧めしません。あなたがCR上に 'numpy'関連のポイントを持っていなければ、何が良いものか分かりません。これは完全に作業コピーではありません。また、用語「最適化」のさまざまな使用法を混同しないでください。 – hpaulj

答えて

1

ボトルネックは分母の計算であるようで、np.einsumのように、要素ごとの乗算と合計削減を実行しているようです。

np.einsum('ij,ij',t[:,None]-t, P) 

タイミングと検証 - - したがって、分母がそうのように計算することができる分子については

In [414]: N = 5000 
    ...: P = np.random.rand(N,N) 
    ...: t = np.random.rand(N) 
    ...: out = (np.sum(P) - np.trace(P))/np.sum(((t[np.newaxis]).T - t) * P) 
    ...: 

# Original method  
In [415]: den1 = np.sum(((t[np.newaxis]).T - t) * P) 

# Proposed method  
In [416]: den2 = np.einsum('ij,ij',t[:,None]-t, P) 

In [417]: np.allclose(den1, den2) 
Out[417]: True 

In [419]: %timeit np.sum(((t[np.newaxis]).T - t) *P) 
10 loops, best of 3: 86.9 ms per loop 

In [420]: %timeit np.einsum('ij,ij',t[:,None]-t, P) 
10 loops, best of 3: 49.7 ms per loop 

、実行時のほとんどはnp.sum(P)に費やされているようだ:

In [422]: %timeit (np.sum(P) - np.trace(P)) 
100 loops, best of 3: 10.4 ms per loop 

In [423]: %timeit np.sum(P) 
100 loops, best of 3: 10.4 ms per loop 

分子をそのまま残すことができます。

関連する問題