遗憾的是,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
请注意提取实际上是如何选择最接近我请求点的纬度值。真正重要的一件事是要注意,如果您的经度坐标不是圆形的,则此函数实际上不处理环绕:
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
最后,注意原始多维数据集的数据是如何没有被加载的(使用我的分支),实际上,来自 small_cube 的数据也被延迟了:
>>> print cube_data_is_loaded(cube)
False
>>> print cube_data_is_loaded(smaller_cube)
False
对于轨迹,一般来说,延迟加载是不可能的,但值得注意的是,在使用 NetCDF 时,索引会直接传递到底层 NetCDF 库,因此整个数组都不会在内存中。
!
PS我还不知道任何与Iris一起使用的样条插值算法,尽管有一个类似的接口可以进行线性插值,如果感兴趣的话。