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



我想迭代数组的每个单元格值。我试过用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_areai的第一个值。

所以你可以把你的代码简化成
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倍或更好的提高。

相关内容

  • 没有找到相关文章

最新更新