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

时间:2019-10-26 11:48:26

标签: python matplotlib

我正在尝试绘制图像,上面绘制了一些东西(例如点,轴等)。为此,我使用了库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),所以我用“ new”不起作用的图像打印img数组,这给了我类似: / p>

[[[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)的新形状,具有我想要的每个像素的值。但是,它仍然不起作用,并且仍然给我与以前相同的错误:MemoryError: Unable to allocate array with shape (3600, 7200, 4) and data type float32,看来它并没有采用新的img数组...(很明显,我在指令{之后执行了删除操作{1}}。

那么,我想念一些明显的东西吗?我该怎么做才能使其正常工作?

1 个答案:

答案 0 :(得分:0)

抱歉,不是真正的解决方案:

显然,matplotlib无法分配足够的内存来绘制所有数据点,最终您只有3600 * 7200 * 4 = 103.680.000个数字。也没有将散点图也考虑在内。

如果仅尝试绘制图像的一部分会发生什么?比方说左上角的四分之一?