python netCDF4不同维度的变量乘法

时间:2019-01-10 16:51:30

标签: python-3.x matplotlib netcdf4

我的第一个变量 h 的维度为(111,141),另一个变量 cs_w 的维度为(51,) 。基本上我的数据是ROMS历史记录输出数据。现在,我想将h与cs_w相乘,最终结果应为尺寸(51,111,141)。在这里,我被卡住了,不准备继续。下面是我的代码

import numpy as np

import matplotlib.pyplot as plt

import netCDF4 as nc

f_in = nc.Dataset('ocean_his_0010.nc', "r")



h = f_in.variables['h']

cs_w = f_in.variables['Cs_w']


z=[[],[],[]]
for i in range(len(h[0])):
    for j in range(len(h[1])):
        for k in range(len(cs_w)):
            z[i][j][k] = h[i][j]*cs_w[k]

这是我要使用的两个变量的说明。

  

出局[88]:      float64 Cs_w(s_w)       long_name:W点的S坐标拉伸曲线       有效时间:-1.0       有效最大值:0.0       栏位:Cs_w,标量   无限尺寸:   当前形状=(51,)   填充,默认_FillValue为9.969209968386869e + 36使用

h 出[89]: float64 h(eta_rho,xi_rho)     long_name:RHO点的测深     单位:米     网格:网格     位置:脸     坐标:lon_rho lat_rho     领域:浴,标量 无限尺寸: 当前形状=(111,141) 填充,默认_FillValue为9.969209968386869e + 36使用

Below is the ncdump ocean_his_0010.nc

netcdf ocean_his_0010 {
dimensions:
        xi_rho = 141 ;
        xi_u = 140 ;
        xi_v = 141 ;
        xi_psi = 140 ;
        eta_rho = 111 ;
        eta_u = 111 ;
        eta_v = 110 ;
        eta_psi = 110 ;
        N = 50 ;
        s_rho = 50 ;
        s_w = 51 ;
        tracer = 2 ;
        boundary = 4 ;
        ocean_time = UNLIMITED ; // (360 currently)

        double Cs_w(s_w) ;
                Cs_w:long_name = "S-coordinate stretching curves at W-points" ;
                Cs_w:valid_min = -1. ;
                Cs_w:valid_max = 0. ;
                Cs_w:field = "Cs_w, scalar" ;
        double h(eta_rho, xi_rho) ;
                h:long_name = "bathymetry at RHO-points" ;
                h:units = "meter" ;
                h:grid = "grid" ;
                h:location = "face" ;
                h:coordinates = "lon_rho lat_rho" ;
                h:field = "bath, scalar" ;

1 个答案:

答案 0 :(得分:1)

您不能只是将(多维)列表定义为z=[[],[],[]]并以您尝试的方式开始填充它,它首先需要适当地设置大小。参见例如this question/answer处理相同的问题。

numpy通常更方便地处理nD数组,您的z数组可以简单地定义为:

z = np.zeros((51,111,141))

例如使用嵌套循环或vectorized instructions填充,例如:

for k in range(51):
    z[k,:,:] = cs_w[k] * h[:,:]

或者甚至是全自动的(甚至不必事先定义z):

import numpy as np

h    = np.zeros((111,141))
cs_w = np.zeros(51)

z = cs_w[:,np.newaxis,np.newaxis] * h

使用这些向量化操作通常比手动写出循环快 更快。