gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:46:51 24 4
gpt4 key购买 nike

我正在编写一个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 向量 rr[:] == 2 (或 r[:] > 0 对于这很重要)返回一个 bool 数组而不是单个 bool 值。因此它不应该用在 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

请引用numpy文档关于advanced indexing更多细节。这种方法比 Python 中的索引循环要高效得多,因此应该尽可能使用这种方法。

关于python - 如何使用 python 对 numpy 数组(来自 netCDF 文件)进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29659455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com