首页 > 解决方案 > 使用 plt.show() -> MemoryError 显示图像时:无法分配形状为 (3600, 7200, 4) 且数据类型为 float32 的数组

问题描述

我正在尝试绘制一个带有一些东西的图像(如点、轴等)。为此,我使用 library 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.        ]
  ...

查了一下,发现每4个数就等于1,好整齐,我只需要删掉它,它没有携带重要信息!我使用img = np.delete(img, 3, 2)它并且效果很好,我得到了(3600, 7200, 3)我想要的每个像素值的新形状。但是,它仍然不起作用,并且仍然给我与以前相同的错误 : MemoryError: Unable to allocate array with shape (3600, 7200, 4) and data type float32,似乎它不需要新的 img 数组...(显然我在指令之后执行了删除img = plt.imread(stim_dir + image_name))。

那么,我是否错过了一些明显的东西?我该怎么做才能让它发挥作用?

标签: pythonmatplotlib

解决方案


对不起,不是真正的解决方案:

显然 matplotlib 无法分配足够的内存来绘制所有数据点,最后你有 3600*7200*4 = 103.680.000 个,这是一个相当大的数字。不考虑散点图您也想绘制。

如果您尝试仅绘制图像的一部分会发生什么?让我们说左上角?


推荐阅读