Numpy Reshape Memory错误

时间:2018-02-24 01:39:47

标签: python numpy

我想重塑图像列表,train_data大小为639976 这是我导入图像的方式,

  train_data=[]
    for img in tqdm(os.listdir('Images/train/images')):
            path=os.path.join ('Images/train/images/',img)
            image=cv2.imread(path,cv2.IMREAD_COLOR)
            image=cv2.resize(image, (28,28)).astype('float32')/255
            train_data.append(image)
    return train_data



  np.reshape(train_data,(-1,28,28,3))

我在这里遇到记忆错误。

 np.reshape(train_data,(-1,28,28,3))

错误:

  

返回数组(a,dtype,copy = False,order = order)   
的MemoryError

1 个答案:

答案 0 :(得分:2)

看起来train_data是一个很大的小数组列表。我不熟悉cv2,所以我猜测

image=cv2.resize(image, (28,28)).astype('float32')/255

创建(28,28)或(28,28,3)浮点数组。本身并不是很大。显然是有效的。

错误在:

np.reshape(train_data,(-1,28,28,3))

由于train_data是列表,reshape必须首先创建一个数组,可能是np.array(train_data)。如果所有组件都是(28,28,3),则此数组已经是(n,28,28,3)形状。但那是发生内存错误的地方。显然有一些小(ish)数组,它没有内存将它们组装成一个大数组。

我试验了一些文件。

In [1]: 639976*28*28*3
Out[1]: 1505223552  # floats
In [2]: _*8
Out[2]: 12041788416   # bytes

12gb阵列是什么?我发现内存错误并不奇怪。数组列表占用的空间不止这些空间,但它们可以通过内存和交换分散在小块中。从列表中创建一个数组,然后将内存使用量增加一倍。

只是为了好玩,尝试制作一个这样大小的空白数组:

np.ones((639976,28,28,3), 'float32')

如果有效,请尝试制作两个。