Какова правильная позиция для сохранения списка в результате двух вложенных циклов for в python?

#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 to 0 в начале 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 .