python 如何使用#nditer以外的方法轻松迭代NumPy数组?

5ssjco0h  于 2023-01-01  发布在  Python
关注(0)|答案(1)|浏览(99)

我想迭代数组的每个单元格值。我尝试使用np.nditer方法(对于np.nditer(bar_st_1)中的i)。然而,即使使用64 GB RAM的笔记本电脑,它也会占用大量的计算时间并耗尽内存。你知道什么是提取每个数组值的最简单和最快的方法吗?谢谢

#Assign the crop specific irrigated area of each array for each month accoridng to the crop calander
#Barley
for Barley in df_dist.Crop:
    for i in np.nditer(bar_st_1):
        for j in df_area.Month:
            for k in df_dist.Planting_month:
                for l in df_dist.Maturity_month:
                    if (j>= min(k,l)) and (j<= max(k,l)):
                        df_area.Barley=i
                    else:
                        df_area.Barley=0

我的目标是从每个数组中提取一个值,并将其分配给每个生长季节(month). df_dist是包含每个月增长面积的区级数据框。bar_st_1是一个数组(7*7),其中包含特定地区的灌溉面积。对于每个特定小区,我想提取相应数组的值,并根据生长季节为特定月份赋值(如果条件如上所述)

2vuwiymt

2vuwiymt1#

for j in df_area.Month:
           for k in df_dist.Planting_month:
               for l in df_dist.Maturity_month:
                   if (j>= min(k,l)) and (j<= max(k,l)):
                       df_area.Barley=i
                   else:
                       df_area.Barley=0

这个代码块看起来浪费了很多精力。如果你改变了迭代的顺序,你可以写

for k in df_dist.Planting_month:
   for l in df_dist.Maturity_month:
      for j in range(min(k,l), max(k,l)+1):
                        df_area.Barley=i

这样你就避免了做大量的比较和计算大量的max(k,l),这是不必要的。
i上的循环也是浪费精力,因为您将df_area.Barley的某些条目写入i,但在以后的迭代中,您用不同的i值覆盖它们,而从未(在您共享的代码中)使用df_area和第一个i值。
所以你可以把代码简化为

for Barley in df_dist.Crop:
   # Initialize the df_area array for this crop with zeros:
   df_area.Barley = np.zeros(df_area.Month.max())
   r, c = bar_st_1.shape
   # Choose the last element in bar_st_1:
   i = bar_st_1[r-1, c-1]
   for k in df_dist.Planting_month:
      for l in df_dist.Maturity_month:
         for j in range(min(k,l), max(k,l)+1):
                           df_area.Barley=i

现在,您已经从嵌套循环结构中消除了一个层次,并缩短了另一个层次的迭代,因此您可能会获得10倍或更高的速度提升。

相关问题