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



我正在尝试绘制一个图像,上面绘制了一些东西(如点、轴等(。为此,我使用库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)之后执行删除操作(。

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

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

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

如果你试图只绘制图像的一部分,会发生什么?比方说左上角?

最新更新