2025, Sep 25 21:16
Matplotlib: есть форма массива, но нет изображения — что делать
Почему в Matplotlib видно только shape массива, а картинка не появляется. Как правильно применять imshow и gfx.show() в Jupyter Notebook и скриптах Python.
При работе с Matplotlib и массивом изображения легко столкнуться с ситуацией, когда в выводе видна только форма массива, а самого изображения нет. Типичный признак — в консоли печатается кортеж вроде (320, 240, 3), а картинка так и не появляется.
Минимальный пример, воспроизводящий проблему
Этот фрагмент выводит форму изображения и пытается показать картинку, но на деле вы можете увидеть только кортеж:
import matplotlib.pyplot as gfx
print(photo_arr.shape)
gfx.imshow(photo_arr)
gfx.axis('off')
Почему так происходит
Здесь важны два момента. Во‑первых, перед показом изображение действительно должно быть загружено в массив. Во‑вторых, способ отрисовки зависит от того, где и как вы запускаете код. В Notebook среда автоматически показывает результат последнего выражения в ячейке. Если последняя строка — что-то иное, а не вывод изображения, картинка не появится, тогда как явный текстовый вывод, например форма, напечатанная через print(), будет виден. Если сделать gfx.imshow(photo_arr) последней строкой, изображение отобразится. Когда нужно отрисовать фигуру без опоры на правило «последнее выражение отображается», вызовите gfx.show(). То же самое относится к обычному Python‑скрипту: используйте print() для текста и gfx.show() для показа фигур.
Рабочее решение
Сначала загрузите изображение, затем покажите его и при необходимости явно инициируйте отрисовку:
import matplotlib.pyplot as gfx
import matplotlib.image as imgio
picture = imgio.imread('img.jpg')
print(picture.shape)
gfx.imshow(picture)
gfx.axis('off')
gfx.show()
Почему это важно
Понимание того, что Notebook показывает автоматически, а что нужно отрисовывать явно, экономит время при отладке кода визуализации. Это также выравнивает поведение между интерактивными сессиями и обычными скриптами. Когда вы сначала загружаете данные и сами управляете моментом отрисовки, рабочий процесс становится предсказуемым, а результаты — видимыми там, где вы их ожидаете.
Выводы
Всегда считывайте изображение до попытки его показать и не полагайтесь на неявную отрисовку, если вам нужна предсказуемость. В Notebook либо оставляйте команду построения последней строкой ячейки, либо вызывайте gfx.show(). В скриптах также используйте gfx.show(), чтобы гарантировать появление окна с фигурой. Придерживаясь этих простых правил, вы избежите ситуации «есть форма, нет изображения» и сохраните цепочку визуализации прозрачной.
Статья основана на вопросе на StackOverflow от Lucio Fernandez и ответе от Tchaivotsky.