簡體   English   中英

脾氣暴躁的“雙重”廣播-有可能嗎?

[英]Numpy “double”-broadcasting - is it possible?

是否可以使用“雙重”廣播刪除以下代碼中的循環? 換句話說,要在整個時間數組T以及相同尺寸的數組freqsphases之間進行廣播。

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))

您可以通過向T添加新軸來將T重塑為2d數組,當與1d數組相乘/相加時將觸發廣播,然后稍后使用numpy.sum折疊此軸:

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

測試

(np.sum(np.cos(freqs * T[:,None] + phases), axis=1) == signal).all()
# True

我剛想到的一個想法(但是這可能在計算上昂貴嗎?)是將參數構造為矩陣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM