繁体   English   中英

更改变量的netcdf文件的值

[英]Changing value of a netcdf file for a variable

我有一个三维的大netcdf文件。 我想替换netcdf文件中的变量LU_INDEX所有值10与2。

我写这个python脚本这样做但它似乎不起作用。

filelocation = 'D:/dataset.nc'

ncdataset = nc.Dataset(filelocation,'r')
lat           = ncdataset.variables['XLAT_M'][0,:,:]
lon           = ncdataset.variables['XLONG_M'][0,:,:]
lu_index     = ncdataset.variables['LU_INDEX'][0,:,:]
lu_index_new = lu_index
ncdataset.close()

nlat,nlon=lat.shape

for ilat in range(nlat):
    for ilon in range(lon):
        if lu_index == 10:
          lu_index_new[ilat,ilon] = 2

newfilename = 'D:/dataset.new.nc'
copyfile(ncdataset,newfilename)


newfile     = nc.Dataset(newfilename,'r+')
newfile.variables['LU_INDEX'][0,:,:]   = lu_index_new
newfile.close()

我收到错误:

The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我对python不是很有经验,所以如果有更简单的方法,我们非常欢迎您发表评论。

您可以尝试NCO

ncap2 -s'其中(LU_INDEX == 10)LU_INDEX = 2'in.nc out.nc

我按照以下方式进行了研究:

import netCDF4 as nc
import numpy as np

pathname = 'D:'
filename = '%s/dataset.nc'%pathname
ncfile = nc.Dataset(filename,'r+')
lu_index = ncfile.variables['LU_INDEX'][:]
I = np.where(lu_index == 10)
lu_index[I] = 2
ncfile.variables['LU_INDEX'][:] = lu_index
filename.close()

print 'conversion complete'

使用np.array可能不适用于具有以下错误的非常大的数据集

“ValueError:数组太大; arr.size * arr.dtype.itemsize大于最大可能大小。”

除了NCO之外,CDO可以是一个很好的工具,对我而言,它的速度非常快。

CDO setvals,10,2 in.nc out.nc

当你必须在同一个nc文件中替换多个变量中的值时(例如替换缺失值表示),它尤其快。 可以使用“setrtoc”代替setval来指定范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM