0

我不确定这里的正确术语是什么,但我正在尝试使用来自多个数组的多个条件来屏蔽 numpy 数组中的一些值。例如,我想查找并屏蔽 X 中数组 t/l、lat2d、x 和 m 满足特定条件的区域。所有数组的形状都相同:(250,500)。我试过这个:

cs[t < 274.0 | 
   l > 800.0 |
   lat2d > 60 |
   lat2d < -60 | 
   (x > 0 & m > 0.8) |
   (x < -25 & m < 0.2)] = np.nan

输入类型不支持 ufunc 'bitwise_and',并且根据转换规则 ''safe'',输入无法安全地强制转换为任何支持的类型。

我替换了 &,| 和/或并得到错误:

ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

我试过创建一个面具:面具= t < 274.0 | l > 800.0 | lat2d > 60 | lat2d < -60 | (x > 0 & m > 0.8) | (x < -25 & m < 0.2),以便在掩码数组中使用但得到相同的错误。

知道如何在 Python 3 中做到这一点吗?

4

2 回答 2

1

这只是运算符优先级的问题:

cs[(t < 274.0) | 
   (l > 800.0) |
   (lat2d > 60) |
   (lat2d < -60) |
   ((x > 0) & (m > 0.8)) |
   ((x < -25) & (m < 0.2))] = np.nan

应该管用

于 2017-03-27T07:50:30.237 回答
0

您可以使用 python 函数来执行此操作,然后将该函数应用于数组。

def cond(x):
    if (np.all(t < 274.0) or np.all(l > 800.0) or np.all(lat2d > 60) or \
        np.all(lat2d < -60) or (np.all(x > 0) and np.all(m > 0.8)) or  \
        (np.all(x < -25) and np.all(m < 0.2))):
        return np.nan

然后将此函数应用于数组:

cs[:] = np.apply_along_axis(cond, 0, cs)
于 2017-03-27T07:38:39.210 回答