gpt4 book ai didi

python - 使用 Python 获取 NetCDF 变量最小值/最大值的最快方法?

转载 作者:太空宇宙 更新时间:2023-11-03 11:52:55 24 4
gpt4 key购买 nike

scipy.io 相比,当切换到 netCDF4 Python 模块时,我从 NetCDF 文件中提取变量数据值的 min/max 的常用方法是一个数量级的慢。 netcdf

我正在处理相对较大的海洋模型输出文件(来自 ROMS),在给定 map 区域(夏威夷)上具有多个深度级别。当这些在 NetCDF-3 中时,我使用了 scipy.io.netcdf

现在这些文件在 NetCDF-4(“经典”)中,我不能再使用 scipy.io.netcdf 而是转而使用 netCDF4 Python 模块。然而,缓慢是一个问题,我想知道是否有更有效的方法来提取变量的数据范围(最小和最大数据值)?

这是我使用 scipy 的 NetCDF-3 方法:

import scipy.io.netcdf
netcdf = scipy.io.netcdf.netcdf_file(file)
var = netcdf.variables['sea_water_potential_temperature']
min = var.data.min()
max = var.data.max()

这是我使用 netCDF4 的 NetCDF-4 方法:

import netCDF4
netcdf = netCDF4.Dataset(file)
var = netcdf.variables['sea_water_potential_temperature']
var_array = var.data.flatten()
min = var_array.data.min()
max = var_array.data.max()

显着的区别是我必须首先在 netCDF4 中展平数据数组,这个操作显然会减慢速度。

有更好/更快的方法吗?

最佳答案

根据 hpaulj 的建议,这里有一个使用 subprocess 调用 nco 命令 ncwa 的函数。使用 OPeNDAP 地址时,它挂得很厉害,而且我手头没有任何文件可以在本地测试它。

您可以查看它是否适合您以及速度差异是什么。

这假设您已经安装了 nco 库。

def ncwa(path, fnames, var, op_type, times=None, lons=None, lats=None):
'''Perform arithmetic operations on netCDF file or OPeNDAP data

Args
----
path: str
prefix
fnames: str or iterable
Names of file(s) to perform operation on
op_type: str
ncwa arithmetic operation to perform. Available operations are:
avg,mabs,mebs,mibs,min,max,ttl,sqravg,avgsqr,sqrt,rms,rmssdn
times: tuple
Minimum and maximum timestamps within which to perform the operation
lons: tuple
Minimum and maximum longitudes within which to perform the operation
lats: tuple
Minimum and maximum latitudes within which to perform the operation

Returns
-------
result: float
Result of the operation on the selected data

Note
----
Adapted from the OPeNDAP examples in the NCO documentation:
http://nco.sourceforge.net/nco.html#OPeNDAP
'''
import os
import netCDF4
import numpy
import subprocess

output = 'tmp_output.nc'

# Concatenate subprocess command
cmd = ['ncwa']
cmd.extend(['-y', '{}'.format(op_type)])
if times:
cmd.extend(['-d', 'time,{},{}'.format(times[0], times[1])])
if lons:
cmd.extend(['-d', 'lon,{},{}'.format(lons[0], lons[1])])
if lats:
cmd.extend(['-d', 'lat,{},{}'.format(lats[0], lats[1])])
cmd.extend(['-p', path])
cmd.extend(numpy.atleast_1d(fnames).tolist())
cmd.append(output)

# Run cmd and check for errors
subprocess.run(cmd, stdout=subprocess.PIPE, check=True)

# Load, read, close data and delete temp .nc file
data = netCDF4.Dataset(output)
result = float(data[var][:])
data.close()
os.remove(output)

return result

path = 'https://ecowatch.ncddc.noaa.gov/thredds/dodsC/hycom/hycom_reg6_agg/'
fname = 'HYCOM_Region_6_Aggregation_best.ncd'

times = (0.0, 48.0)
lons = (201.5, 205.5)
lats = (18.5, 22.5)

smax = ncwa(path, fname, 'salinity', 'max', times, lons, lats)

关于python - 使用 Python 获取 NetCDF 变量最小值/最大值的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21740324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com