用于加载文件和分配变量的循环

时间:2018-03-09 23:15:30

标签: python loops numpy for-loop

我是python的新手,正在开展一个学校项目。我能够编写代码以使我的项目工作。但是,我意识到我这样做的方式非常低效,并且可能有更好的方法来存储和处理3D numpy数组中的数据。我想学习更好的方法来编写这样的代码。

我尝试过搜索,但是我不太了解python,知道要搜索什么或找到答案。

问题1:如何使用for循环重写下面的代码来执行重复的部分?

问题2:我是否应该使用3D numpy数组而不是将数据分配给array_2001,array_2002等?如果是这样,我怎么用数学运算?

from pyhdf.SD
import SD, SDC
import numpy as np
import matplotlib.pyplot as plt
import glob

#Number of images
max_samples = 18

#Values to filter with
exclude_below = 0
exclude_above = 100
min_threshold = 40
max_threshold = 100

#path to directory containing hdf files
file_path = '/Data/2018_2001_georef_MODIS/'

#Get a list of all the .hdf files in the directory
MODIS_files = glob.glob(file_path + '*.hdf')

#Get 2001 data
file = SD(MODIS_files[0], SDC.READ)
datasets_dic = file.datasets()
sds_obj = file.select('NDSI_Snow_Cover') # select sds
Array_2001 = np.array(sds_obj.get()) # get sds data

# Get 2002 data
file = SD(MODIS_files[1], SDC.READ)
sds_obj = file.select('NDSI_Snow_Cover') # select sds
Array_2002 = np.array(sds_obj.get()) # get sds data

#Repeat重复其余文件

#Get 2018 data
file = SD(MODIS_files[17], SDC.READ)
sds_obj = file.select('NDSI_Snow_Cover') # select sds
Array_2018 = np.array(sds_obj.get()) # get sds data
#print ('Array_2018  :', Array_2018)


#Create a boolean mask where 'true' means there is snow on
# on the pixel within the thresholds

snow_mask_2001 = (Array_2001 >= min_threshold) & (Array_2001 <=      max_threshold)
snow_mask_2002 = (Array_2002 >= min_threshold) & (Array_2002 <= max_threshold)
snow_mask_2003 = (Array_2003 >= min_threshold) & (Array_2003 <= max_threshold)

#Repeat重复其余文件

snow_mask_2018 = (Array_2018 >= min_threshold) & (Array_2018 <= max_threshold)


non_snow_2001 = (Array_2001 > exclude_above) | (Array_2001 < exclude_below)
non_snow_2002 = (Array_2002 > exclude_above) | (Array_2002 < exclude_below)
non_snow_2003 = (Array_2003 > exclude_above) | (Array_2003 < exclude_below)

#Repeat重复其余文件

non_snow_2018 = (Array_2018 > exclude_above) | (Array_2018 < exclude_below)

接下来,我将布尔型'true,false'数组转换为1和0。 (为简洁起见,代码未显示)。

#Sum the number of snow days per pixel
snow_days = snow_mask_2001 + snow_mask_2002 + snow_mask_ ...      snow_mask_2018

#sum the number of days with a 'non-snow' reading per pixel
no_reading_days = non_snow_2001 + non_snow_2002 + non_snow_2003 + …     non_snow_2017 + non_snow_2018

在此之后我的代码还有更多内容,但它不是重复的。

感谢任何建议。

1 个答案:

答案 0 :(得分:0)

您可以循环浏览列表中存储的文件,并将所有内容附加到一个大的numpy数组中。在那个numpy数组上你可以做你的掩饰...

#path to directory containing hdf files
file_path = '/Data/2018_2001_georef_MODIS/'

#Get a list of all the .hdf files in the directory
MODIS_files = glob.glob(file_path + '*.hdf')

#?? should be the size of your array.
arr = np.empty((0,??), float)

for file_name in MODIS_files:
    file = SD(MODIS_files[file_name ], SDC.READ)
    datasets_dic = file.datasets()
    sds_obj = file.select('NDSI_Snow_Cover') # select sds
    arr = np.append(arr, np.array(sds_obj.get()), axis=0)