2017-02-17 59 views
1

私は3次元の大きなnetcdfファイルを持っています。私は変数LU_INDEXをnetcdfファイルに置き換え、すべての値10を2に置き換えたい。変数のnetcdfファイルの値を変更する

これを行うにはこのpythonスクリプトを書きましたが、うまくいかないようです。

filelocation = 'D:/dataset.nc' 

ncdataset = nc.Dataset(filelocation,'r') 
lat   = ncdataset.variables['XLAT_M'][0,:,:] 
lon   = ncdataset.variables['XLONG_M'][0,:,:] 
lu_index  = ncdataset.variables['LU_INDEX'][0,:,:] 
lu_index_new = lu_index 
ncdataset.close() 

nlat,nlon=lat.shape 

for ilat in range(nlat): 
    for ilon in range(lon): 
     if lu_index == 10: 
      lu_index_new[ilat,ilon] = 2 

newfilename = 'D:/dataset.new.nc' 
copyfile(ncdataset,newfilename) 


newfile  = nc.Dataset(newfilename,'r+') 
newfile.variables['LU_INDEX'][0,:,:] = lu_index_new 
newfile.close() 

私はエラーを取得する:

The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

は、私は、Pythonで非常に経験はないですので、これを行うために、より簡単な方法がある場合はコメントすることは非常に歓迎されています。

答えて

3

あなたはNCO

ncap2 -s

2

out.nc in.nc私は次のようにそれを働い '(LU_INDEX == 10)LU_INDEX = 2はどこみてください:

import netCDF4 as nc 
import numpy as np 

pathname = 'D:' 
filename = '%s/dataset.nc'%pathname 
ncfile = nc.Dataset(filename,'r+') 
lu_index = ncfile.variables['LU_INDEX'][:] 
I = np.where(lu_index == 10) 
lu_index[I] = 2 
ncfile.variables['LU_INDEX'][:] = lu_index 
filename.close() 

print 'conversion complete' 
+0

NCOとPythonのソリューションの間には、かなりの違いがあります。 –

+2

NCOはおそらく1000倍高速です。プロのヒント:可能な限り常にNCOを活用してください。 –

1

np.arrayを使用すると、次のエラーを伴う非常に大きなデータセットでは機能しない可能性があります。

"ValueError:配列が大きすぎます; arr.size * arr.dtype.itemsizeが最大サイズより大きくなりました。

CDOはNCO以外の素晴らしいツールになり得ます。私にとっては、CDOは非常に高速です。

CDO setvals,10,2 in.nc out.nc 

あなたが(例えば、欠損値の表現を置き換える)、同じNCファイル内に複数の変数の値を交換する必要がある場合には、特に高速です。 範囲指定のためにsetvalの代わりに "setrtoc"を使うことができます。

関連する問題