2016-09-17 15 views
0

4次元のnetCDFファイルがあります。私は次元の名前を与えることによってNetCDFファイルからスライスを抽出したい次元名でnetcdf4可変スライスを抽出

私は位置でこれを行う方法を知っています。例えば。

from netCDF4 import Dataset 
hndl_nc = Dataset(path_to_nc) 

# Access by slice 
hndl_nc.variables['name_variable'][:,5,:,:] 

私はディメンションの名前を知っていることを考えると、ABCDを言います。ポジションではなくディメンション名でアクセスするにはどうすればよいですか?

答えて

1

xarrayのインデックス機能を使用して、ディメンション名でnetcdfデータにアクセスできます。

import xarray as xr 
ds = xr.open_dataset('./foo.nc') 
var = ds['name_variable'] 
# Slice var by Dimension "A" between values 0 and 5 
var_slice = var.sel(A=slice(0,5)) 
1

最も近い現在のソリューションはdim_idsがあなたのスライスのリストやタプルで、dimは、あなたがしたいそれに沿ってディメンションです

np.take(nc4_variable[:],dim_ids,axis=dim) 

または

nc4_variable[:].take(dim_ids,axis=dim) 

ようですスライス。残念ながら、これはデータセット全体を最初に読み込んでいるようで、その周りには道がないようです。 [:]が必要です。最初のメソッドで無視すると、add_offset_FillValueなどのパラメータから調整なしでデータがロードされます。 2番目の方法でそれを無視するとエラーになります。

イピトンでの試験は%timeitで、通常のスライスと方法との間に大きな違いがあることが確認されています。

誰かがこれにもっと完全な答えを思いつきたいと思っています。多様なデータセットに非常に便利です。

0

したがって、私は "ソリューション"となる可能性のあるものを考え出したかもしれません。

numpy配列は、明らかに、イテレータのシングルトンリストで索引付けすることができます。

a = np.reshape(range(0,16),(4,4),order='F') 
a = a[ [[0,1], [1]] ] 

戻りarray([4,5])に等しいa。もう1つの例は[[range(3),[1 2],3]]です。これらのシングルトンリストは、a[ [[0,1],1] ]の代わりにa[[0,1],1]を直接照会したかのように、*subscriptsのように展開されます。

したがって、netCDF変数の各次元の位置と長さ(nc_fid[var].dimensionnc_fid[var].shapeで簡単に)を照会できる場合は、各次元の場所に応じて単純にリストを並べ替えることができます。たとえば、緯度で経度による形状の時間のデータを持っている、あなたは、あなたはこれが必要です

order_want = ['lon', 'lat', 'time'] # must figure out dimension names a priori 
nlon = nc_fid[var].shape[nc_fid[var].dimensions.index('lon')] 
nlat = nc_fid[var].shape[nc_fid[var].dimensions.index('lat')] 
ids = [ range(0,nlon), range(0,nlat), 5 ] 
ids_permute = [order_want.index(n) for n in nc_fid[var].dimensions] 
ids_query = [l[i] for l,i in zip(ids,ids_permute)] 

sliced_data = nc_fid[var][list_query] 

のようなものを使用することができますすべて経度、すべて緯度、及び時間インデックスt=5をしたい場合は先験的ませんではなく、は変数のすべての次元をロードする必要があります。

IPythonでいくつかの%timeitのテストを行った後、全整数インデックス作成のための特別な遅延があるように見えます。 list_query = [0,0,0,0]は、80msとなります。一方、list_query = [range(1),0,0,0]、さらにはlist_query = [[0,1,2,3,4,5],0,0,0]は、1msとなります。非常に不思議な;とにかく、確かにlist_queryが単なる整数のリストではないことを確かめてください。

関連する問題