3D MaskedArray相加报错TypeError:numpy.bool_对象不可迭代求解决
解决3D numpy MaskedArray相加的类型错误问题
我有两个来自气候模型输出的netCDF4文件的3D MaskedArray,希望将它们相加。编写了如下简化代码:
import numpy as np from netCDF4 import Dataset from operator import and_ from numpy.ma.core import MaskedArray with Dataset(dir + 'V10.nc') as file_V10: with Dataset(dir + 'U10.nc') as file_U10: raw_V10 = file_V10.variables['V10'][744 : 9503, :, :] ** 2 raw_U10 = file_U10.variables['U10'][744 : 9503, :, :] ** 2 10m_raw_squared = MaskedArray(raw_V10[:].data + raw_U10[:].data, mask=list(map(and_,raw_V10.mask, raw_U10.mask)))
运行后出现错误:
Traceback (most recent call last): File "code.py", line 92, in <module> 10m_raw_squared = MaskedArray(raw_V10[:].data + raw_U10[:].data, mask=list(map(and_,raw_V10.mask, raw_U10.mask))) TypeError: 'numpy.bool_' object is not iterable
尝试将掩码转为字符串后,又出现错误:
Traceback (most recent call last): File "code.py", line 92, in <module> 10m_raw_squared = MaskedArray(raw_V10[:].data + raw_U10[:].data, mask=list(map(and_,raw_V10.mask.astype('str'),raw_U10.mask.astype('str')))) TypeError: unsupported operand type(s) for &: 'str' and 'str'
尝试用循环相加,导致维度丢失且大部分数组元素丢失,已确认数据集类型为<class 'numpy.ma.core.MaskedArray'>,请问如何正确将这两个数据集相加?
解决方案
方法一:直接利用MaskedArray内置加法(推荐)
numpy的MaskedArray原生支持直接相加,会自动处理掩码逻辑:只要任一数组的对应位置被掩码,结果的该位置就会被掩码。无需手动拆分数据和掩码:
import numpy as np from netCDF4 import Dataset with Dataset(dir + 'V10.nc') as file_V10: with Dataset(dir + 'U10.nc') as file_U10: raw_V10 = file_V10.variables['V10'][744 : 9503, :, :] ** 2 raw_U10 = file_U10.variables['U10'][744 : 9503, :, :] ** 2 10m_raw_squared = raw_V10 + raw_U10
方法二:手动构建新MaskedArray(自定义掩码逻辑时用)
如果需要自定义掩码合并规则,直接用numpy数组的逻辑与操作&处理掩码,不需要map或operator.and_:
import numpy as np from netCDF4 import Dataset from numpy.ma.core import MaskedArray with Dataset(dir + 'V10.nc') as file_V10: with Dataset(dir + 'U10.nc') as file_U10: raw_V10 = file_V10.variables['V10'][744 : 9503, :, :] ** 2 raw_U10 = file_U10.variables['U10'][744 : 9503, :, :] ** 2 # 用numpy数组逻辑与合并掩码 combined_mask = raw_V10.mask & raw_U10.mask # 相加原始数据 combined_data = raw_V10.data + raw_U10.data 10m_raw_squared = MaskedArray(combined_data, mask=combined_mask)
错误原因说明
- 最初用
map(and_, raw_V10.mask, raw_U10.mask)时,map会把3D掩码数组当成迭代器逐元素处理,但numpy的bool_元素本身不是可迭代对象,因此抛出TypeError。 - 将掩码转为字符串后,
and_对应的&操作不支持字符串类型,导致二次报错。
内容的提问来源于stack exchange,提问作者Elsri
相关产品推荐
相关产品推荐

