При отображении изображения с помощью plt.show () -> MemoryError: невозможно выделить массив с формой (3600, 7200, 4) и типом данных float32 - PullRequest
0 голосов
/ 26 октября 2019

Я пытаюсь нанести изображение с некоторыми объектами (например, точками, осями и т. Д.). Для этого я использую библиотеку matplotlib.pyplot. Вот (уменьшенный) код, который я использую:

fig = plt.figure(figsize=(18, 18))
ax = fig.add_subplot(111)
img = plt.imread(stim_dir + image_name)

ax.imshow(img, extent=[-np.pi, np.pi, -np.pi / 2, np.pi / 2])
ax.scatter(*zip(*points), marker='^', s=1, c='red', alpha=0.4)
plt.xlim((-np.pi, np.pi))

plt.title(file_name)
plt.show()

Теперь код работает нормально, когда я использую изображение в формате png, все идеально и все. Но у меня также есть bmp для построения, и там он не работает, не может прочитать растровое изображение, но не беспокойтесь, я могу преобразовать его в png! Однако эти новые png-изображения тоже не работают, и я получаю сообщение об ошибке: MemoryError: Unable to allocate array with shape (3600, 7200, 4) and data type float32.

Итак, я печатаю форму исходного png-изображения, которая работала нормально, чтобы увидеть разницу (и):

>>> print(img.shape)
(2160, 4320, 3)

Я предполагаю, что третье измерение должно быть 3 (для RGB) вместо 4 (которое может быть ARGB), поэтому я печатаю массив img с «новым» неработающим изображением, котороедает мне что-то вроде:

[[[0.46666667 0.46666667 0.46666667 1.        ]
  [0.46666667 0.46666667 0.46666667 1.        ]
  [0.46666667 0.46666667 0.46666667 1.        ]
  ...

Я вижу после проверки, что каждое четвертое число равно 1, так что это аккуратно, я просто должен удалить его, он не несет важную информацию! Я использую img = np.delete(img, 3, 2), и он работает хорошо, я получаю новую форму (3600, 7200, 3) со значениями каждого пикселя, как я хочу. Тем не менее, он все еще не работает, и STILL дает мне ту же ошибку, что и раньше: MemoryError: Unable to allocate array with shape (3600, 7200, 4) and data type float32, похоже, что он не принимает новый массив img ... (Очевидно, я делаю удаление сразу после инструкции img = plt.imread(stim_dir + image_name)).

Итак, я что-то упускаю из виду? Что я мог сделать, чтобы это работало?

1 Ответ

0 голосов
/ 26 октября 2019

Извините, на самом деле это не решение:

Очевидно, что matplotlib не может выделить достаточно памяти для построения всех ваших точек данных, в итоге у вас есть 3600 *7200* 4 = 103.680.000 из них, что довольнономер. Не принимая во внимание диаграмму рассеяния, вы также хотите построить график.

Что произойдет, если вы попытаетесь нанести на график только часть изображения? Скажем, верхняя левая четверть?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...