2017-08-28 6 views
0

私はPythonで行列を使用して、以下のループを実装する:python 2.7(numpy)でループを使わないでこれらの行列演算を行うことは可能ですか?

import numpy as np 

n = 5 # samples 
k = 2 # inputs 
m = 3 # gaussians 

# X is nxk 
X = np.array([[0.0, 10.0], [20.0, 30.0],[40, 50],[60,70],[80,90]]) 

#locations is mxk 
locations = np.array([[0.01, 0.02], [0.03,0.04], [0.05, 0.06]]) 

dev = np.empty([n,k,m]) 

for samples in range(n): 
    for inputs in range(k): 
     for gaussians in range(m): 
      dev[samples,inputs,gaussians]=X[samples,inputs]-locations[gaussians,inputs] 

output = np.empty([n,m]) 

for samples in range(n): 
    for gaussians in range(m): 
     output[samples,gaussians]=np.sum(dev[samples,:,gaussians]*dev[samples,:,gaussians]) 

私はnumpyのは、異なる寸法(Broadcast)の配列を使用して操作を行うことが可能であることを知っているが、私はここにこの概念を使用することはできませんよ。私は基本的にベクトルのサンプルの平均を取り除き、その二乗ノルムを計算することに注意してください。

+1

あなたは両方 'DEVが必要です'と' output'または単に 'output'が必要で、' dev'が中間結果ですか? – Psidom

+0

私はただ "出力"が必要です! – DanielTheRocketMan

答えて

1

forループをこのようにベクトル化できます。 devは、基本的に最初の次元に対してXlocationsの外部操作です。したがって、locations(またはX)に新しい軸を挿入することができます。これにより、結果がどのように転置されるかが影響します。デカルト/アウター減算を返す。第二のために、あなたは、二次元(軸= 1)に沿って自身でdevsumを乗算する必要があります。

mydev = np.transpose(X - locations[:,None], (1,2,0)) 

(mydev == dev).all() 
# True 

myoutput = (mydev**2).sum(axis=1) 

(myoutput == output).all() 
# True 

、または一緒に入れて:

((X[:,None] - locations) ** 2).sum(axis=-1) 

#array([[ 99.6005,  99.2025,  98.8061], 
#  [ 1298.4005, 1296.4025, 1294.4061], 
#  [ 4097.2005, 4093.6025, 4090.0061], 
#  [ 8496.0005, 8490.8025, 8485.6061], 
#  [ 14494.8005, 14488.0025, 14481.2061]]) 
関連する問題