2017-08-07 44 views
0

我正在尝试使用下面的代码将append数据从目录中的31个文件转换为numpy数组。使用a.append创建所需形状的numpy数组

directory = r"C:\Users\matth\Downloads\AMSRE" 
for root, dirs, filenames in os.walk(directory): 
    for f in filenames: 
     if f.startswith("AMSR_E_L3_DailyLand_V06_201001"): 
      log = open(os.path.join(root, f), 'r') 
      file_name = (("C:\\Users\\matth\\Downloads\\AMSRE\\") + f) 
      hdf = SD(file_name, SDC.READ) 
      g = gdal.Open(('HDF4_EOS:EOS_GRID:') + file_name + (':Ascending_Land_Grid:A_Soil_Moisture')) 
      sm = g.ReadAsArray() 
      lons = np.fromstring (urllib2.urlopen("ftp://sidads.colorado.edu/pub/tools/easegrid/lowres_latlon/MLLONLSB").read(), \ 
dtype=np.int32)/100000. 
      lats = np.fromstring (urllib2.urlopen("ftp://sidads.colorado.edu/pub/tools/easegrid/lowres_latlon/MLLATLSB").read(), \ 
dtype=np.int32)/100000. 
      lons = lons.reshape(sm.shape) 
      lats = lats.reshape(sm.shape) 
      smm = np.ma.array (sm, mask=np.logical_or (sm==-9999, sm==9999)) 
      soil_moisture = [] 
      soil_moisture.append(smm) 
      soil_moisture2006 = np.asarray(soil_moisture) 
     output = np.vstack(soil_moisture2006) 

这些文件都开始AMSR_E_L3_DailyLand_V06_201001,这就是为什么我也行

if f.startswith("AMSR_E_L3_DailyLand_V06_201001"): 

一个文件有(586, 1383)的形状。我想有一个numpy数组,形状为(31, 586, 1383),因为目录中有31个文件。但是,当我在我的代码中创建的output阵列的shape的形状是(586, 1383),我不知道为什么。有谁知道我可以如何使用append创建一个形状为(31, 586, 1383)的numpy数组?提前致谢。

+0

在循环外初始化'soil_moisture'。并在循环之后将它变成一个数组。你不应该需要'vstack'。你是否在小型互动案例中练习过?从小处开始。 – hpaulj

回答

1

np.vstack确实将numpy数组的数组(或元组)堆栈到一个数组的行中,但好像你给它一个数组。

我建议在循环访问数据之前初始化output空数组(或其他有错误的值)。那么我建议更换与下面的最后一行,从保持压痕什么它以前

if output: 
    output = np.vstack((output,soil_moisture2006)) 
else: 
    output = soil_moisture2006 

这将尝试将数据追加到output,除非它是第一组数据,在这种情况下,将初始化output到那个数据。这确保output与其余数据形状相同,因此您可以使用vstack。就像上面提到的评论一样,我不知道你是否需要使用vstack,但用我用过的方法试着回答你的问题比完全改写它更容易。

我没有你的文件,所以显然我不能运行这个来测试它,但它似乎可以解决你的问题。让我知道这是否有帮助。

+0

老朋友不鼓励在循环中使用数组连接(或任何'堆栈'变体)。列表追加更有效率。 – hpaulj