2017-08-07 2 views
0

ディレクトリ内の31個のファイルからappendデータをnumpy配列に変換しようとしています。私はラインを持っている理由でa.appendを使用して所望の形状の配列を作成する

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"): 

1つのファイルは(586, 1383)の形状を有しています。ディレクトリに31個のファイルがあるので、numpyの形状の(31, 586, 1383)の配列を持っています。しかし、 output配列のshapeを私のコードで作ったとき、その形状は(586, 1383)であり、私はなぜそれがわからないのですか?誰もを使用して形状がnum3の配列を作成する方法を知っていますか?(31, 586, 1383)?前もって感謝します。

+0

ループの外側に 'soil_moisture'を初期化します。また、ループの後に配列に変換します。 'vstack'は必要ありません。小さなインタラクティブなケースでこれを練習しましたか?小さく始める。 – hpaulj

答えて

1

np.vstack本当にnumpy配列の配列(またはタプル)を配列の行に積み重ねるのですが、1つの配列を与えるようです。

データをループする前に、output空の配列(または他の偽の値)を初期化することをお勧めします。私は、その場合、それをして、それがデータの最初のセットでない限り、それは以前に

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

これは、outputにデータを追加しようとしたものからインデントを維持、次のと最後の行を交換するお勧めしますそのデータにoutputを初期化します。これにより、outputは残りのデータと同じ形になりますので、vstackを使用することができます。上記のコメントのように、vstackを使用する必要があるかどうかはわかりませんが、使用した方法を使用して質問全体に書き換えようとするよりも簡単です。

私はあなたのファイルを持っていないので、私はそれをテストするために実行することはできませんが、あなたの問題を解決するかもしれないようです。これが役に立ったら教えてください。

+0

Oldtimersは配列の連結(または 'stack'バリアントのいずれか)をループ内で使用することを推奨していません。 List appendがより効率的です。 – hpaulj

関連する問題