Python 屏蔽二维numpy数组时出错

Python 屏蔽二维numpy数组时出错,python,python-3.x,numpy,numpy-ndarray,valueerror,Python,Python 3.x,Numpy,Numpy Ndarray,Valueerror,我不确定这里的正确术语是什么,但我试图使用多个数组中的多个条件来屏蔽numpy数组中的一些值。例如,我想找出并遮罩X中数组t/l、lat2d、X和m满足某些条件的区域。所有阵列的形状都相同:(250500)。我试过这个: cs[t < 274.0 | l > 800.0 | lat2d > 60 | lat2d < -60 | (x > 0 & m > 0.8) | (x < -25 & m < 0

我不确定这里的正确术语是什么,但我试图使用多个数组中的多个条件来屏蔽numpy数组中的一些值。例如,我想找出并遮罩X中数组t/l、lat2d、X和m满足某些条件的区域。所有阵列的形状都相同:(250500)。我试过这个:

cs[t < 274.0 | 
   l > 800.0 |
   lat2d > 60 |
   lat2d < -60 | 
   (x > 0 & m > 0.8) |
   (x < -25 & m < 0.2)] = np.nan
cs[t<274.0|
l>800.0|
lat2d>60|
lat2d<-60|
(x>0&m>0.8)|
(x<-25&m<0.2)]=np.nan
输入类型不支持ufunc“按位_和”,并且无法根据强制转换规则“安全”将输入安全强制为任何受支持的类型

我将&、|替换为和/或,得到错误:

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

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


你知道如何在Python3中做到这一点吗?

你可以使用一个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[(t < 274.0) | 
   (l > 800.0) |
   (lat2d > 60) |
   (lat2d < -60) |
   ((x > 0) & (m > 0.8)) |
   ((x < -25) & (m < 0.2))] = np.nan
cs[(t<274.0)|
(l>800.0)|
(lat2d>60)|
(lat2d<-60)|
((x>0)和(m>0.8))|
((x<25)和(m<0.2))]=np.nan

应该工作

数组
l、t、m、x、lat2d
是否已修复?是的,数组已修复。这非常整洁!那么括号就是问题所在?你能解释一下你的()和我的()有什么不同吗?@Shejo284我想这可以归结为按顺序记住优先规则
PEMDAS
。因此,使用括号将始终使事物显式且具有更高的优先级(即首先求值)。问题在于,出于某些技术原因,numpy滥用了按位运算符,而在理想情况下,将使用逻辑运算符。这些按位运算符的运算符优先级高于它们的逻辑同类运算符,因此,例如,如果没有附加括号,您的条件将被解释为t<(274.0 | l)>(800.0 |…这当然没有多大意义。对于初学者来说,按位
并没有在浮点上定义。@PaulPanzer我明白了。谢谢你的解决方案和解释。我今天更聪明了一点,双关语的意思是:-)这是一个有趣的想法,但另一个建议的解决方案可以工作,而且编码更少。不过,请欣赏以下提示:-)
cs[(t < 274.0) | 
   (l > 800.0) |
   (lat2d > 60) |
   (lat2d < -60) |
   ((x > 0) & (m > 0.8)) |
   ((x < -25) & (m < 0.2))] = np.nan