Нахождение 10 лучших максимальных значений в цикле Python - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь найти верхние значения 10/300 в цикле for.Я понимаю, как найти максимальное значение для всего цикла, но я пытаюсь вычислить 300 значений, а затем использовать только первые 10 значений из этих 300.

Вот мой цикл for:

random.shuffle(folder)
for i in range(len(folder)):
if i < 30:
    phaseresult_i = []
    data = np.loadtxt(dir + folder[i])
    time = data[:,0]-2450000
    magnitude = data[:,1]
    #print ('\n File:', folder[i],'\n','Time:',time,'\n', 'Magnitude:', magnitude)
    t = 10000 * time
    y = np.sin(2 * np.pi * t) * time
    frequency, power = LombScargle(t, y).autopower()
    period = np.log(1/frequency)[np.argmax(power)]
    maxpower = power.max()
    for t in range(len(time)):
        #print(t,time[t])
        floor = math.floor((time[t]-time[0])/period)
        phase_i = ((time[t]-time[0])/period)-floor
        phaseresult_i.append(phase_i)
    maxpower_i.append(maxpower)   
    folder_i.append(folder[i])
else: 
    break

Значение, которое я пытаюсь найти, - это максимальные десять мощностей и их периоды.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Вы можете использовать heapq.nlargest с генератором, чтобы получить 10 лучших значений итерируемых.Вот простой пример:

from random import sample
from heapq import nlargest

def gen(n):
    yield from sample(range(n), k=n)

res = nlargest(10, gen(100))

[99, 98, 97, 96, 95, 94, 93, 92, 91, 90]

Теперь вам нужно всего лишь преобразовать свою логику в функцию генератора (см. 1 , 2 ).

0 голосов
/ 01 октября 2018

В демонстрационных целях я перетасовал список из 300 целых чисел, чтобы получить 10 самых высоких значений, вы должны использовать sorted, а затем взять диапазон [-10:]

import random

l = [*range(300)]
random.shuffle(l)

print(sorted(l)[-10:])
[290, 291, 292, 293, 294, 295, 296, 297, 298, 299]

Обновление

random.shuffle(folder)
for i in range(len(folder)):
  max_powers = []
  if i < 3:
    max_powers = []
    phaseresult_i = []
    data = np.loadtxt(dir + folder[i])
    time = data[:,0]-2450000
    magnitude = data[:,1]
    print ('\n File:', folder[i],'\n','Time:',time,'\n', 'Magnitude:', magnitude)
    t = 10000 * time
    y = np.sin(2 * np.pi * t) * time
    # Lomb Scargle Periodogram
    frequency, power = LombScargle(t, y).autopower()
    for period in folder[i]:
        period = np.log(1/frequency)[np.argmax(power)]
        maxpower = power.max()
    max_powers.append((maxpower, i))
    print('\n Max Power = ', maxpower)
    print('\n Period = ', period, '\n ---------------------------')
  print('\n Max Powers, Folder = {}'.format(sorted(max_powers, key=lambda x: x[0])[:-10]))
else:
    break
...