调用np.array(data)时给出MemoryError的大型稀疏列表

时间:2012-03-18 16:14:22

标签: python numpy

我有一个01 s的大矩阵,大部分是0 s。它最初存储为25 thousand个其他列表的列表,每个列表的长度约为2000英寸。

我试图把它们放到一个numpy数组中,这是我程序的另一部分。所以我运行training_data = np.array(data),但这会返回MemoryError

为什么会这样?我假设它有太多的内存供程序处理(这对我来说很令人惊讶......),但如果是这样,有没有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

(短)整数需要两个字节来存储。你想要25,000个列表,每个列表有2,000个整数;这给了

25000*2000*2/1000000 = 100 MB

这在我的电脑上工作正常(4GB RAM):

>>> import numpy as np
>>> x = np.zeros((25000,2000),dtype=int)

你能够实例化上面的零矩阵吗?

您是否正在将文件读入Python列表中,然后将其转换为numpy数组?这是个坏主意;它至少会使内存需求翻倍。您的数据的文件格式是什么?

对于稀疏矩阵scipy.sparse提供了各种替代数据类型,效率会更高。


编辑:回应OP的评论。

  

我有25000个其他类的实例,每个类都返回一个长度约为2000的列表。我想把所有这些列表都返回到np.array

嗯,你以某种方式超过8GB!要解决这个问题,请不要在内存中进行所有这些操作。一次将数据写入磁盘一个类,然后删除实例并从numpy读取文件。

首先做

with open(..., "wb") as f:
    f = csv.writer(f)
    for instance in instances:
        f.writerow(instance.data)

这会将您的所有数据写入一个大型的CSV文件中。然后,您可以使用np.loadtxt

numpy.loadtxt(open(..., "rb"), delimiter=",")