Numpy "double"-广播 - 这可能吗?
Numpy "double"-broadcasting - is it possible?
是否可以使用"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))
您可以通过向其添加新轴将 T
重塑为二维数组,这将在使用一维数组 multiplied/added 时触发广播,然后稍后使用 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
是否可以使用"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))
您可以通过向其添加新轴将 T
重塑为二维数组,这将在使用一维数组 multiplied/added 时触发广播,然后稍后使用 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