2016-01-19 4 views
2

Хорошо. ниже приведенный код. Я хочу зацикливать два разных набора данных, каждый на один год. получите значение процентиля hailindx по каждому значению вероятности града и запишите их. Поскольку мне нужно зацикливать эти два набора данных 1 год, но это очень медленно.Python, работающий с 2 ​​для петель вместе

from matplotlib import pyplot as plt 
from matplotlib import mlab 
import netCDF4 as net 
import numpy as np 
import itertools days=["01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"] 
months=["01","02","03","04","05","06","07","08","09","10","11","12"] 
hp_values=range(0,100) 
for value in hp_values: 
    value1=[] 
    print value 
    for month,day in itertools.product(months,days): 
     print month,day 
     try: 
      hailindx1="/Trunk/2015HailIndx/HailIndx2015%s%sL0S_CONUS.nc"%(month,day) 
      hailprob1="/Trunk/2015/aerHailProb2015%s%s.nc" %(month,day) 
      hailindx=net.Dataset(hailindx1) 
      hailprob=net.Dataset(hailprob1) 
      hp=hailprob.variables['HailProb'][:] 
      hs=hailindx.variables['HailIndx'][:] 
      p=[0.05,0.1,0.2] 
      hp=np.array(hp) 
      hs=np.array(hs) 
      mask=(hp>0) & (hs>0) 
      hs=hs[mask] 
      hp=hp[mask] 
      value2=hs[hp==value] 
      if len(value2)>0: 
       value1.append(value2) 
      else: 
       continue 
     except: 
      continue 
    value_list=[value,value,value] 
    print value_list 
    if len(value1)>0: 
     perc=np.percentile(value1,p) 
     plt.plot(value_list,perc,marker='o',color='r') 
    else: 
     continue 

plt.xlabel('HailProb') 
plt.ylabel('HailIndx') 
plt.show() 

Если кто-то знает, как сделать цикл быстрее.

+0

Почему бы не просто использовать две петли? – Izkata

+0

Это слишком медленно – alice

+2

Это медленный из-за цикла или из-за того, что вы делаете внутри цикла? – JCVanHamme

ответ

1

Вы можете использовать itertools.product, чтобы получить все комбинации. Как это:

for month, day in itertools.product(months, days): 
    ...do something... 
+0

это не собирается давать ему ускорение ... и хуже его гораздо менее разборчивым и понятным, что делает hes (даже если это то, что OP просил: P) –

0

Вы можете использовать функцию product() из itertools:

from itertools import product 

months=["01","02","03","04","05","06","07","08","09","10","11","12"] 
days=["01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"] 

answer = list(product(months, days)) 

Выход

[('01', '01'), 
('01', '02'), 
('01', '03'), 
('01', '04'), 
('01', '05'), 
... 
('12', '28'), 
('12', '29'), 
('12', '30'), 
('12', '31')] 

Вы можете перебрать переменной answer по желанию.

0

Обратите внимание, что ваши петли возвратят невозможные даты, такие как 2015/02/31. Возможно, лучше работать с датами напрямую.

Также обратите внимание, что вы загружаете и фильтруете каждый файл данных 100 раз; вам действительно нужно только загрузить его один раз, и вы можете фильтровать его за один проход, если вы умны.

Возможно, ваш hp_values должен быть range(0, 101), т.е. 100 - это возможное значение?

Что-то вроде

from datetime import date, timedelta 
import numpy as np 

YEAR = 2015 
# using datetime.strftime format codes 
INDEX_FILE = "/Trunk/%YHailIndx/HailIndx%Y%m%dL0S_CONUS.nc" 
PROB_FILE = "/Trunk/%Y/aerHailProb%Y%m%d.nc" 

def date_range(start_date, end_date, step=timedelta(1)): 
    day = start_date 
    while day < end_date: 
     yield day 
     day += step 

def main(): 
    start = date(YEAR,  1, 1) 
    end = date(YEAR + 1, 1, 1) 
    for day in date_range(start, end): 
     # load index file 
     try: 
      index_file = day.strftime(INDEX_FILE) 
      index_data = net.Dataset(index_file) 
     except RuntimeError as re: 
      print(re) 
      print("Failed to load index file:", index_file) 
      continue     
     # load probability file 
     try: 
      prob_file = day.strftime(PROB_FILE) 
      prob_data = net.Dataset(prob_file) 
     except RuntimeError as re: 
      print(re) 
      print("Failed to load probability file:", prob_file) 
      continue     
     # start calculating 
     index = np.array(index_data.variables['HailIndx']) 
     prob = np.array(prob_data .variables['HailProb']) 
     # 
     # Here I started to get a bit lost trying to follow what 
     # you are doing; a sample index file and probability file 
     # would probably help in debugging, as would a better 
     # description of exactly what you are trying to do to 
     # the numbers ;-) 
     # 

if __name__ == "__main__": 
    main() 
Смежные вопросы