如何使用python对numpy数组(来自netCDF文件)进行比较?

时间:2015-04-15 19:45:39

标签: python comparison netcdf

我正在编写一个读取两个不同netCDF文件的python脚本,并且在对变量进行评估后进行一些计算,这个想法是(代码的概念示例,真实的一个太长) :

import netCDF4
import numpy as np
#other modules loaded...

#Values
a = 2
b = 4
c = 1

def srf(r, h):
    if r[:] == 2:
        if h[:] > 0:
            surf = 1 + b
        else:
            surf = a + b 
    else:
        surf = a - c

return surf

path_file : /home/file.nc
fhp = Dataset(path_file, r+)
ra = fhp.variables['VAR'][:]
path_file2 : /home/file2.nc
fhp2 = Dataset(path_file2, r+)
hu = fhp2.variables['VAR2'][:]   

#Call the Function
srf(ra, hu)       

netCDF文件每个都有3个维度,如果我尝试运行此代码,我会收到此错误

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

我需要在las两个维度中执行的功能,这些维度包含要在域中检查的信息[TSTEP,ROW,COL]。所以我需要循环维度,但我不知道该怎么做,我也不知道是否有最简单的方法。谢谢

2 个答案:

答案 0 :(得分:1)

这个问题与netCDF无关,而是与从netCDF文件中获取的操作numpy数组有关。

问题是,给定一个numpy向量rr[:] == 2(或r[:] > 0就此而言)返回一个布尔数组而不是一个布尔值。因此,它不应该用于if构造。根据您要完成的任务,您可以使用以下方法,

  • 使用(r[:] == 2).any()(r[:] == 2).all()代替
  • 使用更复杂的索引,例如,

    import numpy as np
    
    def srf(r, h):
        mask_r = (r[:] == 2)
        mask_h = (h[:] > 0)
        surf  = np.ones(r.shape)*(a-c)
        surf[mask_r&mask_h] = 1 + b
        surf[mask_r&(~mask_h)] = a + b
        return surf
    

有关详细信息,请参阅有关advanced indexing的numpy文档。这种方法比python中的索引循环更有效,并且应该尽可能使用。

答案 1 :(得分:0)

此外,如果要沿特定轴应用函数,可以使用numpy.apply_along_axis。

例如,如果要沿时间轴应用函数srf,则可以执行

将numpy导入为np srf_arr = np.apply_along_axis(srf,axisnumber,arrayname)