Python 用不带for循环的sin/cos填充矩阵的列

Python 用不带for循环的sin/cos填充矩阵的列,python,numpy,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)

每当我编写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循环?

您可以使用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)
但是你仍然需要把它放回原始矩阵。你们可以用步幅作为面具,用cos填充a。然后以奇怪的步伐作为面具,用罪恶填满


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

您可以利用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)

在python中,您可以使用一些函数式编程范例。但它主要不是一种函数式编程语言。以函数方式重写numpy代码几乎没有任何意义。