2017-09-11 73 views
1

是否可以使用「double」 - 廣播去除下面的代碼中的循環?換句話說,要在整個時間陣列T以及相同尺寸的陣列freqsphases上廣播。Numpy「double」 - 廣播 - 有可能嗎?

freqs = np.arange(100) 
phases = np.random.randn(len(freqs)) 
T = np.arange(0, 500) 

signal = np.zeros(len(T)) 
for i in xrange(len(signal)): 
    signal[i] = np.sum(np.cos(freqs*T[i] + phases)) 

回答

1

可以通過添加新的軸線到它,這將觸發時乘以廣播重塑T作爲2D陣列/加入與一維數組,然後稍後使用numpy.sum摺疊此軸:

np.sum(np.cos(freqs * T[:,None] + phases), axis=1) 
#      add new axis  remove it with sum 

測試

剛來找我(?但可能是計算昂貴)10

+0

我是正確的,這實際上是一樣的我的回答如下 - 在這種情況下廣播意味着構建外部產品?純粹要求清楚。 – aabeshou

+1

是的。你是對的。 'np.outer(freqs,T)'與'freqs [:,None] * T'相同。 – Psidom

1

一個想法是構建參數爲矩陣:

phases = phases.reshape((len(phases), 1)) 
argumentMatrix = np.outer(freqs, T) + phases 
cosineMatrix = np.cos(argumentMatrix) 
signal = np.sum(cosineMatrix, axis=0) # sum, collapsing columns