如何在python中更新现有的netCDF数组
我有一个如下所示的代码,我想根据另一个NetCDF文件更新现有的NetCDF文件。如果在现有NetCDF文件的另一个NetCDF文件如何在python中更新现有的netCDF数组,python,arrays,netcdf,Python,Arrays,Netcdf,我有一个如下所示的代码,我想根据另一个NetCDF文件更新现有的NetCDF文件。如果在现有NetCDF文件的另一个NetCDF文件value=0,则该文件为0。所以我只考虑其他NETCDF不等于0 的地方。 import netCDF4 as net days=["01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","
value=0
,则该文件为0。所以我只考虑其他NETCDF不等于0 的地方。
import netCDF4 as net
days=["01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"]
months=["02","03","04","05","06","07"]
for month in months:
for day in days:
try:
infile=net.Dataset("2015%s%s-160000_0.nc" % (month,day),"w")
value=infile.variables['HailProb'][:]
value1=infile1.variables['hailsie'][:]
infile[value==0 or value1==0]==0
infile.close()
except RuntimeError:
continue
因为如果我在写模式下打开
infle
,我担心所有现有数据都会被重写。有人能看看我是如何解决这个问题的吗?代码有什么问题?用a
以追加模式打开文件:
infile=net.Dataset("2015%s%s-160000_0.nc" % (month,day), "a")
现在,您可以读取和写入现有文件,如文档所述:
a
和r+
平均附加(与
串行文件);打开现有文件进行读写操作
我相信你的代码有几个问题
r+
(或者,如Mike Müller所述,在a
)模式下阅读它infle[value==0或value1==0]==0
,infle
不是您的数据数组,而是netCDF4
对象。要更改变量,您需要类似于infle.variables[“HailProb”]…
infle[..]==0
,=
测试相等性,它不会在infle
中设置新值(如果infle
实际上是一个数组,则使用=
)value==0或value1==0的行将不起作用;需要类似于(value==0)|(value1==0)
的内容来切片数组
import netCDF4 as net
days=["01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"]
months=["02","03","04","05","06","07"]
for month in months:
for day in days:
try:
infile = net.Dataset("2015%s%s-160000_0.nc" % (month,day), "r+")
value = infile.variables['HailProb'][:]
value1 = infile1.variables['hailsie'][:]
infile.variables['HailProb'][(value==0) | (value1==0)] = 0
infile.close()
except RuntimeError:
continue
一个更完整的工作示例,它还创建了NetCDF文件以供使用:
import netCDF4 as nc4
import numpy as np
# Create NetCDF file 1
nc1 = nc4.Dataset('nc1.nc', 'w')
nc1.createDimension('z', 10)
nc_var = nc1.createVariable('HailProb', 'f8', 'z')
# Add some dummy data, and set a single value to zero:
nc_var[:] = np.random.randint(2, 10, size=10)
nc_var[5] = 0
nc1.close()
# Create NetCDF file 2
nc2 = nc4.Dataset('nc2.nc', 'w')
nc2.createDimension('z', 10)
nc_var = nc2.createVariable('hailsie', 'f8', 'z')
# Add some dummy data, and set a single value to zero:
nc_var[:] = np.random.randint(2, 10, size=10)
nc_var[3] = 0
nc2.close()
# Read files back
# File 1 in in "r+" mode, since we want to edit it
nc1 = nc4.Dataset('nc1.nc', 'r+')
value = nc1.variables["HailProb"][:]
# File 2 only required "r" (read) mode
nc2 = nc4.Dataset('nc2.nc', 'r')
value1 = nc2.variables["hailsie"][:]
# Update NetCDF file based on some conditions
nc1.variables["HailProb"][(value==0) | (value1==0)] = 0
nc1.close()
nc2.close()
运行代码的第一部分(创建nc1.nc
和nc2.nc
)后,ncdump-v HailProp nc1.nc
和ncdump-v hailcie nc2.nc
给出了以下信息:
HailProb = 2, 9, 6, 6, 9, 0, 5, 4, 8, 6 ;
hailsie = 4, 6, 2, 0, 4, 3, 6, 4, 5, 7 ;
运行代码的第二部分后,我得到:
HailProb = 5, 6, 8, 0, 7, 0, 6, 4, 2, 4 ;
追加模式不是只从数组末尾追加而不是更新吗?现在的问题是infle[value==0或value1==0]==0是错误的,它给了我一个错误。你想用
infle[value==0或value1==0]==0实现什么。不能将[]
与文件对象一起使用。[(值==0)|(值1==0)]isnit条的含义是什么?但实际上我想要一个orNo,&
意味着,
是或。例如,参见文档numpy
中也有内置的运算符,因此类似于nc1.variables[“HailProb”][np.logical_或(value==0,value1==0)]=0的东西也应该像我说的那样工作。该文件根本没有被更新。它仍然是同一个文件,我可以看到填充的日期没有改变。你能更新你的帖子并添加你现在正在尝试的代码吗?否则,我们只能猜测到底出了什么问题