Попытка создать замаскированный временной интервал, но возвращает AttributeError: у объекта 'numpy.ndarray' нет атрибута 'dim_coords', когда он пытается построить график радужной оболочки
Я пытаюсь создать контурный график, показывающий годовые концентрации растворенного железа за годы до 1860-1900 гг. И пытаюсь исключить все значения выше определенного значения (0,000012), поскольку они относятся к конкретному региону, который отбрасывает мои данные.
Ниже приведен скрипт, который я использую, и каждая отдельная часть работает (до этого я, конечно, импортировал все соответствующие модули).
dissolved_iron = iris.load_cube('/home/em379/data/dis2/regriddedfiles/HadGEM2-ES_dfe_piControl_r1i1p1_regridded.nc')
dissolved_iron_timeslice = dissolved_iron.extract(iris.Constraint(time = lambda v: 1860 <= v <= 1900))
masked_dissolved_iron_timeslice = ma.masked_greater(dissolved_iron_timeslice.data, 0.000012)
qplt.contourf(masked_dissolved_iron_timeslice,25)
plt.show(block = False)
Когда я доберусь до ступеньки qplt.contourf(masked_dissolved_iron_timeslice,25)
, Python возвращает ошибку:
AttributeError: 'numpy.ndarray' object has no attribute 'dim_coords':
>>> qplt.contourf(masked_dissolved_iron_timeslice,25)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/Iris-1.7.0_dev-py2.7.egg/iris/quickplot.py", line 184, in contourf
result = iplt.contourf(cube, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/Iris-1.7.0_dev-py2.7.egg/iris/plot.py", line 579, in contourf
result = _draw_2d_from_points('contourf', None, cube, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/Iris-1.7.0_dev-py2.7.egg/iris/plot.py", line 275, in _draw_2d_from_points
plot_defn = _get_plot_defn(cube, mode, ndims=2)
File "/usr/local/lib/python2.7/dist-packages/Iris-1.7.0_dev-py2.7.egg/iris/plot.py", line 127, in _get_plot_defn
for dim_coord in cube.dim_coords:
AttributeError: 'MaskedArray' object has no attribute 'dim_coords'
1 ответ
Ошибка дает нам ключ к пониманию того, что происходит:
AttributeError: 'MaskedArray' object has no attribute 'dim_coords'
Для меня это звучит так: "Вы пытаетесь сделать куб с помощью MaskedArray".
Итак, глядя на ваш код, это действительно так:
masked_dissolved_iron_timeslice = \
ma.masked_greater(dissolved_iron_timeslice.data, 0.000012)
masked_dissolved_iron_timeslice
теперь это массив масок, а не кубик радужки. Если вы просто хотите посмотреть на свои данные, решение состоит в том, чтобы перейти от использования функции построения графиков iris к использованию matplotlib:
# Use plt, not qplt:
plt.contourf(masked_dissolved_iron_timeslice, 25)
plt.show()
Конечно, если вы хотите немного больше контекста (и поддерживать куб), вы можете обновить данные существующего куба с помощью:
dissolved_iron_timeslice = ...
dissolved_iron_timeslice.data = \
ma.masked_greater(dissolved_iron_timeslice.data, 0.000012)
Или, если вы не хотите изменять существующий куб:
dissolved_iron_timeslice = ...
ma_iron_t = dissolved_iron_timeslice.copy()
ma_iron_t.data = \
ma.masked_greater(dissolved_iron_timeslice.data, 0.000012)
С этими кубами вы можете продолжать использовать qplt и получить автоматическую маркировку /colorbar/colormap/title, которую обеспечивает Iris.
НТН