屏蔽 2d numpy 数组时出错
Error when masking 2d numpy array
我不确定此处的正确术语是什么,但我正在尝试使用来自多个数组的多个条件来屏蔽 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'”无法将输入安全地强制转换为任何受支持的类型。
我替换了&,|使用 and/or 并得到错误:
ValueError: 具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
我尝试创建一个掩码:mask = t < 274.0 | l > 800.0 |纬度 > 60 | lat2d < -60 | (x > 0 & m > 0.8) | (x < -25 & m < 0.2),以便在掩码数组中使用但得到相同的错误。
知道如何在 Python 3 中执行此操作吗?
您可以使用 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)
这只是运算符优先级的问题:
cs[(t < 274.0) |
(l > 800.0) |
(lat2d > 60) |
(lat2d < -60) |
((x > 0) & (m > 0.8)) |
((x < -25) & (m < 0.2))] = np.nan
应该可以
我不确定此处的正确术语是什么,但我正在尝试使用来自多个数组的多个条件来屏蔽 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'”无法将输入安全地强制转换为任何受支持的类型。
我替换了&,|使用 and/or 并得到错误:
ValueError: 具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
我尝试创建一个掩码:mask = t < 274.0 | l > 800.0 |纬度 > 60 | lat2d < -60 | (x > 0 & m > 0.8) | (x < -25 & m < 0.2),以便在掩码数组中使用但得到相同的错误。
知道如何在 Python 3 中执行此操作吗?
您可以使用 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)
这只是运算符优先级的问题:
cs[(t < 274.0) |
(l > 800.0) |
(lat2d > 60) |
(lat2d < -60) |
((x > 0) & (m > 0.8)) |
((x < -25) & (m < 0.2))] = np.nan
应该可以