Попытка создать замаскированный временной интервал, но возвращает 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.

НТН

Другие вопросы по тегам