是否可以使用“double”-broadcasting删除以下代码中的循环?换句话说,要在整个时间数组T
以及相同维度的数组freqs
和phases
进行广播。
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))
答案 0 :(得分:1)
您可以通过向其添加新轴来将T
重新整形为2d数组,这将在乘以/添加与1d数组时触发广播,然后再使用{ {1}}要折叠此轴:
numpy.sum
测试:
np.sum(np.cos(freqs * T[:,None] + phases), axis=1)
# add new axis remove it with sum
答案 1 :(得分: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