2017-07-19 13 views
2

私は、ドットプロダクトには合計の積が含まれているという事実を利用して、回答がnp.dotだった同様のquestionを尋ねました。 (私の理解のため)軸のループオーバーを放送に置き換えてください。

ここでは、dotが適用されるとは思わない、同様の問題があります。なぜなら、合計の代わりに、要素単位の対角線を取りたいからです。もしそうなら、私はそれを正しく適用することができませんでした。

マトリックスx及び配列err考える:

x = np.matrix([[ 0.02984406, -0.00257266], 
       [-0.00257266, 0.00320312]]) 

err = np.array([ 7.6363226 , 13.16548267]) 

ループと私の現在の実装は、次のとおり

erriため x.dot(i)の対角線をとる
res = np.array([np.sqrt(np.diagonal(x * err[i])) for i in range(err.shape[0])]) 

print(res) 
[[ 0.47738755 0.15639712] 
[ 0.62682649 0.20535487]] 

。これはベクトル化できますか?言い換えれば、x * errの出力をnp.diagonalとし、各対角線に対して1つの要素を持つ2次元配列を得ることができますか?

答えて

2

プログラム:

import numpy as np 
x = np.matrix([[ 0.02984406, -0.00257266], 
       [-0.00257266, 0.00320312]]) 

err = np.array([ 7.6363226 , 13.16548267]) 
diag = np.diagonal(x) 
ans = np.sqrt(diag*err[:,np.newaxis]) # sqrt of outer product 
print(ans) 

# use out keyword to avoid making new numpy array for many times. 
ans = np.empty(x.shape, dtype=x.dtype) 
for i in range(100): 
    ans = np.multiply(diag, err, out=ans) 
    ans = np.sqrt(ans, out=ans) 

結果:

[[ 0.47738755 0.15639712] 
[ 0.62682649 0.20535487]] 
+0

は遅い新しいnumpyの配列を、割り当てを回避するためにキーワードを使用することができます。 –

+0

Pythonの旧バージョンでは** 0.5よりも高速です。新しいことについてはわからない。 https://stackoverflow.com/questions/327002/which-is-faster-in-python-x-5-or-math-sqrtx私は通常、sqrtと入力するのが面倒です –

+0

新しい配列の割り当てについて心配しないでくださいこれを何回も行うのではなく、一度だけ行うようにしてください。 –

2

ここで、その後xndarray.flatとしてdiagonal-viewを利用したアプローチがそうのように、要素ごとの乗算にbroadcastingを使用します -

np.sqrt(x.flat[::x.shape[1]+1].A1 * err[:,None]) 

サンプル実行 - コピーを作成しますviewnp.diagonal上でどのように役立つかを確認する

In [108]: x = np.matrix([[ 0.02984406, -0.00257266], 
    ...:    [-0.00257266, 0.00320312]]) 
    ...: 
    ...: err = np.array([ 7.6363226 , 13.16548267]) 
    ...: 

In [109]: np.sqrt(x.flat[::x.shape[1]+1].A1 * err[:,None]) 
Out[109]: 
array([[ 0.47738755, 0.15639712], 
     [ 0.62682649, 0.20535487]]) 

ランタイムテスト -

In [104]: x = np.matrix(np.random.rand(5000,5000)) 

In [105]: err = np.random.rand(5000) 

In [106]: %timeit np.diagonal(x)*err[:,np.newaxis] 
10 loops, best of 3: 66.8 ms per loop 

In [107]: %timeit x.flat[::x.shape[1]+1].A1 * err[:,None] 
10 loops, best of 3: 37.7 ms per loop 
関連する問題