したがって、私は "ソリューション"となる可能性のあるものを考え出したかもしれません。
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].dimension
とnc_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
が単なる整数のリストではないことを確かめてください。