我想迭代数组的每个单元格值。我试过用np。Nditer方法(for I in np.nditer(bar_st_1)。然而,即使是64 GB内存的笔记本电脑,它也需要大量的计算时间和内存耗尽。你知道提取每个数组值的最简单和最快的方法是什么吗?由于
#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
我的目标是提取每个数组的值,并为每个生长季节(月)分配它。Df_dist是一个区级数据框架,包含每个月的增长面积。Bar_st_1是一个数组(7*7),它包含一个特定地区的灌溉面积。对于每个特定的单元格,我想提取相应数组的值,并根据生长季节(如果条件如上所述)为其指定特定的月份
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倍或更好的提高。