每当我写一个for循环时,我会问自己是否会有更多功能的方法来编写它。我没有为这个for循环提出一些东西,用sin / cos填充矩阵的列。
k = 5 #this is any odd integer
t = np.arange(0,N)/fs #time array for the sin/cos
A = np.zeros((N,k))
A[:,0] = 1
for i in range(1, k, 2):
A[:,i] = np.cos(2*np.pi*freq*t*(i+1)/2)
A[:,i+1] = np.sin(2*np.pi*freq*t*(i+1)/2)
我正在使用numpy,因为之后用于更多数学。我意识到替换for循环可能没什么好处,因为它非常简单,但有没有办法替换for循环呢?
答案 0 :(得分:3)
您可以利用NumPy的矢量化,而不是循环,使用索引数组,例如:
assert k & 1
odd = np.arange(1, k, 2)
even = odd + 1
A = np.zeros((N, k))
A[:, 0] = 1
A[:, odd] = np.cos(2 * np.pi * freq * t[:, None] * even / 2)
A[:, even] = np.sin(2 * np.pi * freq * t[:, None] * even / 2)
答案 1 :(得分:0)
您可以使用tile并使用您在循环中使用的值构建A
。然后你就可以使用那个矩阵并尝试一次完成cos和sin计算:
A = np.tile(np.arange(0, 5), (3,1))
A[:,0] = 1
A[:,1:] += 1
A看起来像这样:
array([[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5]])
然后你可以对计算进行矢量化吗?
cos = np.cos(2*np.pi*freq*t*(A)/2)
sin = np.sin(2*np.pi*freq*t*(A)/2)
但是你仍然需要把它放回原始矩阵中。你甚至可以采取大步作为面具,并使用填充A和cos。然后采取奇怪的步幅作为面具并填充罪。
不确定这是否有帮助(或者如果正确),只是另一种不使用循环的思考方式。