[英]How to perform comparisons on numpy arrays (from netCDF files) using python?
我正在编写一个python脚本,该脚本读取两个不同的netCDF文件,并且在对变量执行评估后进行了一些计算后,其想法是(代码想法的示例实在太长了):
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()
我需要在两个维度上执行该功能,即包含要在域[TSTEP,ROW,COL]中检查的信息的两个维度。 因此,我需要遍历各个维度,但是我不确定该怎么做,我也不知道是否有最简单的方法。 谢谢
这个问题与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)*(ac) surf[mask_r&mask_h] = 1 + b surf[mask_r&(~mask_h)] = a + b return surf
请参阅有关高级索引的numpy文档以获取更多详细信息。 与循环遍历python中的索引相比,此方法明显更有效,应尽可能使用它。
另外,如果要沿特定轴应用功能,则可以使用numpy.apply_along_axis。
例如,如果您想沿时间轴应用srf函数,则可以
导入numpy为np srf_arr = np.apply_along_axis(srf,axisnumber,arrayname)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.