悲しいことに、Iris の最近傍コードは現在、必要なインデックスを識別するためにデータをロードします。これを修正するために、簡単なプル リクエスト (テストによって複雑になっています) を送信しました ( https://github.com/SciTools/iris/pull/707 )。これを使用して、このサイズのデータセットを操作できます。
サンプル データのキューブを使用します。
import iris
cube = iris.load_cube(iris.sample_data_path('air_temp.pp'))
そして、次の関数でロードされたデータがあるかどうかを確認できます。
def cube_data_is_loaded(cube):
# A None data manger means the data is loaded...
return cube._data_manager is None
そう:
>>> print cube_data_is_loaded(cube)
False
基本的に、最近傍のインターフェイス ( http://scitools.org.uk/iris/docs/latest/iris/iris/analysis/interpolate.html#iris.analysis.interpolate.extract_nearest_neighbour ) を使用すると、ポイント抽出を実行できます。
from iris.analysis.interpolate import extract_nearest_neighbour
smaller_cube = extract_nearest_neighbour(cube,
(('longitude', -180), ('latitude', 1.5)))
>>> print smaller_cube
air_temperature / (K) (scalar cube)
Scalar coordinates:
forecast_period: 6477 hours
forecast_reference_time: 1998-03-01 03:00:00
latitude: 2.50002 degrees
longitude: 180.0 degrees
pressure: 1000.0 hPa
time: 1996-12-01 00:00:00
Attributes:
STASH: m01s16i203
source: Data from Met Office Unified Model
Cell methods:
mean: time
抽出によって、要求したポイントに最も近い緯度値が実際にどのように選択されたかに注目してください。本当に重要なことの 1 つは、経度座標が円形でない場合、この関数は実際にはラッピングを処理しないことに注意することです。
cube.coord('longitude').circular = False
smaller_cube = extract_nearest_neighbour(cube,
(('longitude', -180), ('latitude', 1.5)))
cube.coord('longitude').circular = True
>>> print smaller_cube
air_temperature / (K) (scalar cube)
Scalar coordinates:
forecast_period: 6477 hours
forecast_reference_time: 1998-03-01 03:00:00
latitude: 2.50002 degrees
longitude: 0.0 degrees
pressure: 1000.0 hPa
time: 1996-12-01 00:00:00, bound=(1994-12-01 00:00:00, 1998-12-01 00:00:00)
Attributes:
STASH: m01s16i203
source: Data from Met Office Unified Model
Cell methods:
mean: time
元の立方体の経度範囲 (0 ~ 360) が、-180 に最も近い値が実際には 0 であることを意味していることに注意してください。
軌跡抽出を行う関数もあります ( http://scitools.org.uk/iris/docs/latest/iris/iris/analysis/trajectory.html?highlight=trajectory#iris.analysis.trajectory.interpolate ):
smaller_traj = interpolate(cube,
(('longitude', [-180, -180]), ('latitude', [1.5, 3.5])),
'nearest')
>>> print smaller_traj
air_temperature / (K) (*ANONYMOUS*: 2)
Auxiliary coordinates:
latitude x
longitude x
Scalar coordinates:
forecast_period: 6477 hours
forecast_reference_time: 1998-03-01 03:00:00
pressure: 1000.0 hPa
time: 1996-12-01 00:00:00, bound=(1994-12-01 00:00:00, 1998-12-01 00:00:00)
Attributes:
STASH: m01s16i203
source: Data from Met Office Unified Model
Cell methods:
mean: time
最後に、元のキューブのデータが (私のブランチを使用して) 全体にロードされていないことに注意してください。実際、smaller_cube からのデータも延期されています。
>>> print cube_data_is_loaded(cube)
False
>>> print cube_data_is_loaded(smaller_cube)
False
トラジェクトリでは、一般に遅延読み込みはできませんが、NetCDF を使用する場合、インデックスは基礎となる NetCDF ライブラリに直接渡されるため、配列全体がメモリ内に存在することはありません。
チッ!
PS Irisで動作するスプライン補間アルゴリズムはまだ知りませんが、線形補間を行うための同様のインターフェースがあり、興味がある場合は.