Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中更新现有的netCDF数组_Python_Arrays_Netcdf - Fatal编程技术网

如何在python中更新现有的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","

我有一个如下所示的代码,我想根据另一个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","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的东西也应该像我说的那样工作。该文件根本没有被更新。它仍然是同一个文件,我可以看到填充的日期没有改变。你能更新你的帖子并添加你现在正在尝试的代码吗?否则,我们只能猜测到底出了什么问题