繁体   English   中英

Python NetCDF IOError:netcdf:NetCDF:无效的维度ID或名称

[英]Python NetCDF IOError: netcdf: NetCDF: Invalid dimension ID or name

我正在用python编写脚本来处理NetCDF文件,但是在创建变量时遇到了一些问题,这是代码的一部分:

stepnumber_var = ofl.createVariable("step_number", "i",("step_number",))
stepnumber_var.standard_name = "step_number"

atomNumber_var = ofl.createVariable("atom_number", "i", ("atom_number",))
atomNumber_var.standard_name = "atom__number"

但是给我这个错误:

Traceback (most recent call last):
  File "sub_avg.py", line 141, in <module>
    atomNumber_var = ofl.createVariable("atom_number", "i", ("atom_number",))
IOError: netcdf: NetCDF: Invalid dimension ID or name

我的问题是,为什么第一个变量创建没有问题,而第二个变量却不起作用?

谢谢

这是完整的代码

from array import array 
import os
import sys
import math
import string as st
import numpy as N
from Scientific.IO.NetCDF import NetCDFFile as S

if len(sys.argv) < 2:
    sys.exit( "No input file found. \nPlease privide NetCDF trajectory input file" )
#######################
## Open NetCDF file ### 
#######################
infl = S(sys.argv[1], 'r')  

file = sys.argv[1]
title,ext = file.split(".")

                                #for v in infl.variables:   # Lists the variables in file
                                #   print(v)        

#################################################################################
# Variable "configurations" has the structure [step_number, atom_number, x y z] #
#################################################################################

varShape = infl.variables['configuration'].shape        # This gets the shape of the variable, i.e. the dimension in terms of elements

nSteps = varShape[0]                                
nAtoms = varShape[1]


coordX_atom = N.zeros((nSteps,nAtoms))
coordY_atom = N.zeros((nSteps,nAtoms))
coordZ_atom = N.zeros((nSteps,nAtoms))

sumX = [0] * nAtoms
sumY = [0] * nAtoms
sumZ = [0] * nAtoms

######################################################
# 1) Calculate the average structure fron trajectory #
######################################################

for i in range(0, 3):
    for j in range(0, 3):
        coordX_atom[i][j] = infl.variables["configuration"][i,j,0]
        coordY_atom[i][j] = infl.variables["configuration"][i,j,1]
        coordZ_atom[i][j] = infl.variables["configuration"][i,j,2]

        sumX[j] = sumX[j] + coordX_atom[i][j]
        sumY[j] = sumY[j] + coordY_atom[i][j]
        sumZ[j] = sumZ[j] + coordZ_atom[i][j]

avgX = [0] * nAtoms
avgY = [0] * nAtoms
avgZ = [0] * nAtoms

for j in range(0, 3):
    avgX[j] = sumX[j]/nSteps 
        avgY[j] = sumY[j]/nSteps
        avgZ[j] = sumZ[j]/nSteps

##############################################################
# 2) Subtract average structure to each atom and for each frame #
##############################################################

for i in range(0, 3):
    for j in range(0, 3):
                coordX_atom[i][j] = infl.variables["configuration"][i,j,0] - avgX[j]
                coordY_atom[i][j] = infl.variables["configuration"][i,j,1] - avgY[j]
                coordZ_atom[i][j] = infl.variables["configuration"][i,j,2] - avgZ[j]

#######################################
# 3) Write new NetCDF trajectory file #                      
#######################################

ofl = S(title + "_subAVG.nc", "a")
############################################################
# Get information of variables contained in the NetCDF input file
#############################################################

i = 0
for v in infl.variables:       
    varNames = [v for v in infl.variables]
    i += 1
#############################################
# Respectively get, elements names in variable, dimension of elements and lenght of the array variableNames
##############################################
for v in infl.variables["box_size"].dimensions:
    boxSizeNames = [v for v in infl.variables["box_size"].dimensions]
for v in infl.variables["box_size"].shape:
    boxSizeShape = [v for v in infl.variables["box_size"].shape]
boxSizeLenght = boxSizeNames.__len__()

print boxSizeLenght

for v in infl.variables["step"].dimensions:
    stepNames = [v for v in infl.variables["step"].dimensions]
for v in infl.variables["step"].shape:
    stepShape = [v for v in infl.variables["box_size"].shape]
stepLenght = stepNames.__len__()
print stepLenght

for v in infl.variables["configuration"].dimensions:
    configurationNames = [v for v in infl.variables["configuration"].dimensions]
for v in infl.variables["configuration"].shape:
    configurationShape = [v for v in infl.variables["configuration"].shape]
configurationLenght = configurationNames.__len__()
print configurationLenght

for v in infl.variables["description"].dimensions:
    descriptionNames = [v for v in infl.variables["description"].dimensions]
for v in infl.variables["description"].shape:
    descriptionShape = [v for v in infl.variables["description"].shape]
descriptionLenght = descriptionNames.__len__()
print descriptionLenght

for v in infl.variables["time"].dimensions:
    timeNames = [v for v in infl.variables["time"].dimensions]
for v in infl.variables["time"].shape:
    timeShape = [v for v in infl.variables["time"].shape]
timeLenght = timeNames.__len__()
print timeLenght

#Get Box size

xBox =  infl.variables["box_size"][0,0]
yBox =  infl.variables["box_size"][0,1]
zBox =  infl.variables["box_size"][0,2]

# Get description lenght
description_lenghtLenght = infl.variables["description"][:]

############################################################
# Create Dimensions
############################################################

stepnumber_var = ofl.createVariable("step_number", "i",("step_number",))
stepnumber_var.standard_name = "step_number"

atomNumber_var = ofl.createVariable("atom_number", "i", ("atom_number",))
atomNumber_var.standard_name = "atom__number"


#
#xyz_var = ofl.createVariable("xyz", "f",("xyz",))
#xyz_var.units = "nanometers"
#xyz_var.standard_name = "xyz"
#
#configuration_var = ofl.createVariable("configuration", "f", ("step_number", "atom_number", "xyz"))
#configuration_var.units = "nanometers"
#configuration_var.standard_name = "configuration"
#
#print configuration_var.shape
#step_var = ofl.createVariable("box_size_lenght", 3)
#configuration_var = ofl.createVariable("atom_number", nAtoms)
#description_var = ofl.createVariable("xyz", 3)
#time_var = ofl.createVariable(description_lenght, description_lenghtLenght)
#
#a = infl.variables["step_number"].dimensions.keys()
#print a

谢谢!

这可能是图书馆试图“提供帮助”的情况(有关详细信息,请参见我的文章结尾,但我无法确认)。 要解决此问题,您应该在创建变量之前通过使用以下内容为atom_number和step_number显式创建尺寸(假设我正确理解了nSteps和nAtoms):

ofl.createDimension(“ step_number”,nSteps)ofl.createDimension(“ atom_number”,nAtoms)

如果您是netCDF的新手,建议您查看netcdf4-python软件包,

http://unidata.github.io/netcdf4-python/

在scipy中找到的netCDF软件包:

http://docs.scipy.org/doc/scipy/reference/io.html

可能发生的情况:问题似乎是当您创建变量step_number时,该库试图通过创建长度不受限制的step_number维来提供帮助。 但是,netcdf-3文件中只能有一个无限的尺寸,因此有用的“技巧”不起作用。

atomNumber_var.standard_name =“ atom__number”

atom__number有两个“ __”而不是一个“ _”。 我不确定这是否是您的问题,但这可能是要看的东西。

我还建议使您的netcdf文件步骤更清晰。 我喜欢将它们分解为3个步骤。 我以使用Ocean SST的科学数据为例。 您也有一个用于创建尺寸的部分,但实际上并没有这样做。 这是更正确地创建变量部分。

  1. 创建尺寸

  2. 创建变量

  3. 填写变量

     from netCDF4 import Dataset ncfile = Dataset('temp.nc','w') lonsdim = latdata.shape #Set dimension lengths latsdim = londata.shape ############### #Create Dimensions ############### latdim = ncfile.createDimension('latitude', latsdim) londim = ncfile.createDimension('longitude', lonsdim) ############### #Create Variables ################# The variables contain the dimensions previously set latitude = ncfile.createVariable('latitude','f8',('latitude')) longitude = ncfile.createVariable('longitude','f8',('longitude')) oceantemp = ncfile.createVariable('SST','f4' ('latitude','longitude'),fill_value=-99999.0) ############### Fill Variables ################ latitude[:] = latdata #lat data to fill in longitude[:] = londata #lon data to fill in oceantemp[:,:] = sst[:,:] #some variable previous calculated 

我希望这是有帮助的。

暂无
暂无

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

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