【发布时间】:2019-12-02 10:25:57
【问题描述】:
我希望能够通过操纵比例因子来压缩存储在 netcdf 文件中的数组,并通过转换数组数据类型(即 float32 到 int16)添加要应用于数组的偏移量
我想将通常太大而无法在 python 中使用的栅格数据制作成更小更易于管理的栅格。我知道可以针对 netcdf 数据应用比例因子和偏移量,不仅可以使文件大小更小,而且在加载数组以便于内存管理时,同样的逻辑是否适用。我已经有另一种方法可以使用不同的 numpy 来管理大型数组,但我想用 netcdfs 来实现这一点。
我已经有了以下基于多个链接http://james.hiebert.name/blog/work/2015/04/18/NetCDF-Scale-Factors.html的代码
我正在使用的测试文件是我为自己生成的一个 netcdf 文件,其中包含一个 float32 numpy 数组,并通过 gdal translate 从 geotiff 文件转换为 netcdf
import netCDF4
from math import floor
import numpy as np
def compute_scale_and_offset(min, max, n):
# stretch/compress data to the available packed range
scale_factor = (max - min) / (2 ** n - 1)
# translate the range to be symmetric about zero
add_offset = min + 2 ** (n - 1) * scale_factor
return scale_factor, add_offset
def pack_value(unpacked_value, scale_factor, add_offset):
return unpacked_value - add_offset / scale_factor
def unpack_value(packed_value, scale_factor, add_offset):
return packed_value * scale_factor + add_offset
netcdf_path = r"path/to/netcdf"
nc = netCDF4.Dataset(netcdf_path,"a")
data = nc.variables['Band1'][:]
scale_factor,offset = compute_scale_and_offset(np.min(data),np.max(data),16)
data = pack_value(data,scale_factor,offset)
data_b = data.astype(np.int16,copy=False)
nc.variables['Band1'][:] = data_b
nc.close()
现在,当我运行上述代码时,我正在使用的文件的大小没有改变,但核心数据数组的输出值确实发生了变化。我的预期结果将是对上述代码的更改,该代码将使用任何通用 netcdf 文件来转换数据数组并允许应用偏移量并将其存储在文件中,以便在从 netcdf4 读取时加载它们。
【问题讨论】:
-
不是你的问题的答案,但我认为应该是
return (unpacked_value - add_offset) / scale_factor... -
另外,
nc.variables['Band1'][:] = data_b只是将data_b转换为Band1的任何数据类型。我不认为 NetCDF4 允许您更改 NetCDF 数据类型,并且删除变量(并使用另一种数据类型重新创建它们)也很困难/不可能,因此您可能必须创建一个具有正确数据类型的全新 NetCDF 文件,对于这样一个简单的任务,这听起来很麻烦:-(
标签: python arrays memory raster netcdf4