Opendap と NetCDF では、不規則なインデックス作成を使用した抽出は許可されていません。スタート、ストップ、ストライドのみをリクエストできます。
また、これは三角形グリッドであるため、同じ領域内の三角形のノードが同様のインデックスを持つという保証はありません。したがって、バウンディング ボックス内のノードのみを取得する場合は、1 つずつ要求する必要があります。そしてそれは遅いです。したがって、多くの場合、最小インデックスと最大インデックスを決定し、そのチャンク全体を 1 つの部分として要求してから、必要に応じてインデックスを抽出する方が高速です。
Python での 2 つのアプローチのサンプル比較を次に示します。この例では、すべてのインデックスを含むサブセットを抽出すると、各インデックスをループして時系列を抽出するよりも約 10 倍速くなります。
import netCDF4
import time
import numpy as np
url='http://www.smast.umassd.edu:8080/thredds/dodsC/FVCOM/NECOFS/Forecasts/NECOFS_GOM3_FORECAST.nc'
nc = netCDF4.Dataset(url)
ncv = nc.variables
lon = ncv['lon'][:]
lat = ncv['lat'][:]
tim = ncv['time'][:]
# find indices inside box
box = [-71.4,41,-70.2,41.5]
ii = (lon>=box[0])&(lon<=box[2])&(lat>=box[1])&(lat<=box[3])
# jj will have just indices from inside the box:
jj = np.where(ii)[0]
各インデックスをループすると、遅くなります。
# loop over indices, extracting time series
time0=time.time()
zi = np.zeros((len(tim),len(jj)))
k=0
for j in jj:
zi[:,k]=ncv['zeta'][:,j]
k +=1
print('elapsed time: %d seconds' % (time.time()-time0))
elapsed time: 56 seconds
しかし、時間ステップごとに範囲をループすると、はるかに高速になります。
time0=time.time()
zi2 = np.zeros((len(tim),len(jj)))
jmin=jj.min()
jmax=jj.max()
for i in range(len(tim)):
ztmp = ncv['zeta'][i,jmin:jmax+1]
zi2[i,:] = ztmp[jj-jmin]
print('elapsed time: %d seconds' % (time.time()-time0))
elapsed time: 6 seconds
もちろん、構造化されていないグリッドのサイズ、サブセット内のポイントの近さ、抽出するポイントの数などによって、結果は異なる場合があります。