使用sin / cos填充矩阵的列而不进行循环

时间:2015-09-04 17:05:16

标签: python numpy

每当我写一个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循环呢?

2 个答案:

答案 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。然后采取奇怪的步幅作为面具并填充罪。

不确定这是否有帮助(或者如果正确),只是另一种不使用循环的思考方式。