我正在编写一个读取两个不同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]。所以我需要循环维度,但我不知道该怎么做,我也不知道是否有最简单的方法。谢谢
答案 0 :(得分:1)
这个问题与netCDF无关,而是与从netCDF文件中获取的操作numpy数组有关。
问题是,给定一个numpy向量r
,r[:] == 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)