Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python一起处理2个for循环_Python_Loops_Itertools - Fatal编程技术网

Python一起处理2个for循环

Python一起处理2个for循环,python,loops,itertools,Python,Loops,Itertools,嗯。下面是完整的代码。我想循环两个不同的数据集,每个数据集为期一年。获取每个hail prob值处的hailindx值百分位数,并绘制它们。因为我需要循环这两个1年的数据集,但速度非常慢 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"

嗯。下面是完整的代码。我想循环两个不同的数据集,每个数据集为期一年。获取每个hail prob值处的hailindx值百分位数,并绘制它们。因为我需要循环这两个1年的数据集,但速度非常慢

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()
如果有人知道如何使循环更快

您可以使用获取所有组合。像这样:

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

您可以使用
itertools
中的
product()
函数:

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
变量。

请注意,您的循环将返回不可能的日期,如2015/02/31。直接处理日期可能更好

还要注意,您正在加载和过滤每个数据文件100次;你真的只需要加载它一次,如果你聪明的话,你可以一次过滤它

另外,您的
hp\u值
可能应该是
范围(0,101)
ie 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()
from datetime导入日期,timedelta
将numpy作为np导入
年份=2015年
#使用datetime.strftime格式代码
INDEX_FILE=“/Trunk/%YHailIndx/HailIndx%Y%m%dL0S_CONUS.nc”
PROB_FILE=“/Trunk/%Y/aerHailProb%Y%m%d.nc”
定义日期范围(开始日期、结束日期、步长=时间增量(1)):
日期=开始日期
日期<结束日期:
收成日
天+=步数
def main():
开始=日期(年份,1,1)
结束=日期(年份+1,1,1)
对于日期范围内的日期(开始、结束):
#加载索引文件
尝试:
index\u file=day.strftime(index\u文件)
index\u data=net.Dataset(index\u文件)
除运行时错误外,请参阅:
打印(re)
打印(“加载索引文件失败:”,索引文件)
继续
#装载概率文件
尝试:
prob_文件=day.strftime(prob_文件)
prob_data=net.Dataset(prob_文件)
除运行时错误外,请参阅:
打印(re)
打印(“加载概率文件失败:”,prob_文件)
继续
#开始计算
index=np.array(index_data.variables['HailIndx']))
prob=np.array(prob_数据变量['HailProb'])
#
#在这里,我开始有点迷路了,试图去了解什么
#你在做什么;一个示例索引文件和概率文件
#可能有助于调试,更好的
#描述您正试图对其执行的操作
#数字;-)
#
如果名称=“\uuuuu main\uuuuuuuu”:
main()

它的速度慢是因为循环还是因为你在循环中所做的事情?itertools.product不会提供加速。。。只是说你是对的,只是试过了,都一样(它的速度慢是因为你对月/日所做的事情……重复这几乎是瞬间。你想用月和日做什么来表示它太慢?这不会给他一个加速……更糟糕的是,他在做什么更不清晰(即使这是OP要求的:P)