Numpy“双重”广播有可能吗?

2024-04-25 03:55:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: 代码forsignallennp时间zerosrandom
2条回答

通过向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

相关问题 更多 >