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

时间:2011-09-02 13:58:29

标签: python numpy matplotlib

我想绘制一个20万个对象的数组,我有8GB内存,但是当我运行以下行时仍然会出现以下错误:

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

2 个答案:

答案 0 :(得分:6)

由于显示器和绘图仪的物理限制,您无论如何都无法绘制20,000,000点。因此,您可以通过采样或使用切片来减少阵列:

>>> 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 :(得分:2)

MemoryError没有说谎 - 你的内存分配失败了。考虑到你试图计划2亿点(注意你发布的数字是2亿,而不是2000万),这并不是不合理的。

很少或根本没有意义绘制数百万点。当我有大型数据集时,我会对数据进行预处理,以便绘制的数据不超过数千个。对于像您这样的数据,一个简单的常规样本就可以了,但是对于其他数据的精细描述,可能需要找到峰值。