我有一个0
和1
s的大矩阵,大部分是0
s。它最初存储为25 thousand
个其他列表的列表,每个列表的长度约为2000英寸。
我试图把它们放到一个numpy数组中,这是我程序的另一部分。所以我运行training_data = np.array(data)
,但这会返回MemoryError
为什么会这样?我假设它有太多的内存供程序处理(这对我来说很令人惊讶......),但如果是这样,有没有更好的方法呢?
答案 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=",")