2015-09-04 7 views
3

Всякий раз, когда я пишу цикл for, я спрашиваю себя, не будет ли более функциональный способ написать его. Я не могу придумать что-то для этого цикла, заполняя столбцы матрицы с sin/cos.Заполните столбцы матрицы с 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, поскольку это довольно тривиально, но есть ли способ заменить это на цикл?

+0

в Python вы можете использовать несколько функциональных парадигм программирования. Но это не прежде всего функциональный язык программирования. Переписывание numpy-кода функциональным способом редко имеет смысл. – cel

ответ

0

Вы можете использовать плитки и построить A со значениями, которые вы используете в своем цикле. Тогда вы можете просто использовать эту матрицу и попытаться сделать соз и расчеты грешат все сразу:

A = np.tile(np.arange(0, 5), (3,1)) 
A[:,0] = 1 
A[:,1:] += 1 

А, то выглядит следующим образом:

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) 

Но вам все равно придется вернуть его обратно в матрицу orignal. Вы можете сделать малейшие шаги в качестве маски и использовать заполнение A с помощью cos. Затем сделайте нечетные шаги как маску и заполните грех.

Не уверен, что это помогает (или, если правильно), просто еще один способ думать без использования цикла.

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)