Python 中四个嵌套循环的效率方式

The efficiency way of four nested loops in Python

提问人:Gemstone 提问时间:5/4/2023 最后编辑:TimusGemstone 更新时间:5/5/2023 访问量:64

问:

我在python中有四个嵌套循环。

data = {'alt' : talt,
        'lat' : tlat,
        'lon' : tlon,
        'LT'  : tpLT,
        'temp': temp}
        
data = pd.DataFrame(data)

gap_alt = 10.
int_alt = np.arange(30, 111, gap_alt)
lat_rng = np.arange(-55, 55.1, 10)
lon_rng = np.arange(0, 360.1, 30)

temp_all = np.full([len(lon_rng)-1, len(lat_rng)-1, len(int_alt), 24], np.nan)

在这里,我有包含海拔、纬度、经度、当地时间和温度的数据(数据帧)。

数据是一维的(data),我想把这个数组变成四维数组(temp_all)。

for loop_lat in lat_grid:
    for loop_lon in lon_grid:
        for loop_ht in height_grid:
            for loop_hr in hour_grid:
                idx = [(data.lat >= lat_rng[loop_lat]) & (data.lat < lat_rng[loop_lat+1]) &
                (data.lon >= lon_rng[loop_lon]) & (data.lon < lon_rng[loop_lon + 1]) &
                (data.LT >= loop_hr) & (data.LT < loop_hr+1) &
                (data.alt >= int_alt[loop_ht]-gap_alt/2.) & (data.alt < int_alt[loop_ht]+gap_alt/2)][0]

                temp0[loop_lon, loop_lat, loop_ht, loop_hr] = np.mean(temp[idx])

在这个过程中,花费的时间太长了...... 有什么有效的方法吗?

Python 中四个嵌套循环的效率方式

Python 循环 嵌套 多处理

评论

2赞 Patrick Haugh 5/4/2023
看起来您已经设置了一些数据。您能否描述一下这些数据的形状和它所代表的内容,以及您试图用它做什么?
0赞 Andrew Ryan 5/4/2023
一个稍微快一点的方法是尝试计算在最外层循环中重用的一些项目,这样你就不会在最里面的循环中继续重新计算它,但查看数据的一般结构和你正在尝试做的事情将提供更多的效率提升。
0赞 Gemstone 5/4/2023
@PatrickHaugh我添加了数据的详细信息以及我想做什么!
0赞 Tim Roberts 5/4/2023
您可以在外部循环中计算外部循环的索引值,而不是强制它一遍又一遍地搜索数据帧。
0赞 Gemstone 5/4/2023
@TimRoberts 它意味着什么?你能更详细地解释一下吗?

答:

1赞 Tim Roberts 5/5/2023 #1

我所说的注释的意思是,将表达式的不变部分移出最里面的循环。这可能只是速度的微小改进。您真正需要的是一种不同的方法,因此您不必每次都搜索。data

for loop_lat in lat_grid:
    lats = (lat_rng[loop_lat] <= data.dat) & (data.lat < lat_rng[loop_lat+1])
    for loop_lon in lon_grid:
        lons = (lon_rng[loop_lon] <= data.lon) & (data.lon < lon_rng[loop_lon+1])
        for loop_ht in height_grid:
            hts =   (int_alt[loop_ht]-gap_alt/2 <= data.alt) & (data.alt < int_alt[loop_ht]+gap_alt/2)]
            for loop_hr in hour_grid:
                hrs = (loop_hr <= data.LT) & (data.LT < loop_hr+1)
                idx = lats & lons * hts & hrs
                temp0[loop_lon, loop_lat, loop_ht, loop_hr] = np.mean(temp[idx])