2017-08-28 31 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

你既需要'開發'和'output'或者你只需​​要'output'和'dev'就是中間結果? – Psidom

+0

我只需要「輸出」! – DanielTheRocketMan

回答

1

你可以像這樣向量化你的for循環; dev基本上是相對於第一維的Xlocations的外部操作,所以您可以在locations(或X,這隻會影響您將如何轉置結果)插入一個新軸,並且減法將觸發numpy廣播和給予笛卡爾/外部減法;對於第二個,你需要乘dev與自身sum沿第二維度(軸= 1):

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]]) 
相關問題