尝试使用matplotlib绘制大型数组时出现内存错误

5

我想绘制一个包含2000万个对象的数组,我有8GB的RAM,但当我运行以下代码时仍然出现以下错误:

import matplotlib.pyplot as plt
import numpy as np

d = np.arange(200000000)
plt.plot(d)
plt.show()

错误:

Traceback (most recent call last):
...
  File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 317, in _grab_next_args
    for seg in self._plot_args(remaining, kwargs):
  File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 292, in _plot_args
    x = np.arange(y.shape[0], dtype=float)
MemoryError

1
看起来你试图绘制两亿个对象,而不是两千万个对象。 - Xavier Combelle
2个回答

6

由于显示器和绘图仪的物理限制,您无法绘制2000万个点。因此,您可以通过对其进行采样或使用切片的方法来减少数组:

>>> m = 20000000
>>> a = np.arange(m)
>>> n = 100 # <- reducing to 100 points
>>> s = m/n # <- size of slices to compress
>>> reduced = []
>>> for i in xrange(n):
...     slice = a[i*s:(i+1)*s]
...     reduced.append(np.mean(slice))
>>> reduced
[99999.5, 299999.5, ..., 19699999.5, 19899999.5]

假设您正在绘制的对象上使用np.mean是有意义的。

1
或者,如果 np.mean 没有意义或不需要,您可以通过适当索引的切片来简单地使用原始数组:reduced = a[::s] - Alf
如果您需要进行数组缩减,那么在 n = 100 行之后,仅需执行以下操作即可更快地完成:a = np.mean(a.reshape(100,-1), axis=1)。 - paddyg

2

MemoryError(内存错误)并不是假的 - 你遇到了一个内存分配失败的问题。考虑到你试图绘制2亿个点(注意,你发布的数字是2亿而不是2千万),这其实并不是那么不合理。

很少或者从来没有理由去绘制上百万个点。当我处理大型数据集时,我会对数据进行预处理,以便我最多只绘制数千个点。像你所拥有的数据一样,一个简单的常规采样就可以胜任这项工作,但是对于其他数据的展示,可能需要使用峰值查找等技术。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接