#python #pandas #numpy #loops #nested-loops
#python #pandas #numpy #циклы #вложенные циклы
Вопрос:
Итерация должна начинаться с p = 1, затем второй цикл for должен суммировать все значения для диапазона r . После завершения второго цикла я хочу сохранить результат в первом элементе списка (ap). Затем p= 2 и процесс повторяется, а новое значение a должно быть сохранено во втором элементе списка ap … и так далее и тому подобное
Я пытаюсь сделать это с фреймом данных, из которого я уже знаю, каким будет результат, поэтому я знаю, что мой код выполняет другую вещь. Я предполагаю, что позиция списка ap находится не в правильном месте? Должен ли я пробовать с сериями в pandas или массивами с Numpy?
Спасибо за вашу помощь
m=12
n=6
ap=[]
for p in range(1,n):
for r in range(-n,n):
a = a (1/n)*((data3.loc[r].iat[1])*(np.cos((2*(np.pi)*p*r)/m)))
ap = [a]
#?
#?
Комментарии:
1. Вероятно, вам нужно инициализировать
a
to0
в началеp
цикла, иначе вы добавляете к итогу предыдущееp
значение.2. Обычный способ добавления в список
ap.append(a)
3. Добавление списка также должно происходить вне
for r in ...
цикла
Ответ №1:
Мы можем реорганизовать ваш код, используя функции и выражения генератора, чтобы быть немного аккуратнее. Также в вашей формуле, похоже, есть куча ненужных круглых скобок.
m = 12
n = 6
ap = []
def calculate(p, r):
return (1/n) * data3.loc[r].iat[1] * np.cos(2*np.pi * p * r) / m
for p in range(1, n):
a = sum(calculate(p, r) for r in range(-n, n))
ap.append(a)
Это создаст список ap
длины n-1
Комментарии:
1. Спасибо @Adam Smith! Это работает отлично! Я только что изменил позицию возврата «m» (1 / n) * data3.loc[r].iat[1] * np.cos( 2 * np.pi * p * r / m) , потому что «m» является частью аргумента cosine .