2017-08-07 40 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