Numpy“double”-broadcasting - 有可能吗?

时间:2017-09-11 23:38:46

标签: python arrays numpy python-2.x numpy-broadcasting

是否可以使用“double”-broadcasting删除以下代码中的循环?换句话说,要在整个时间数组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))

2 个答案:

答案 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