ValueError:无法将形状(22500,3)的输入数组广播为形状(1)

时间:2017-03-22 02:31:37

标签: python pickle

我依赖于上面提到的代码here,但是进行了少量修改。我的版本如下:

import numpy as np
import _pickle as cPickle
from PIL import Image
import sys,os

pixels = []
labels = []
traindata = []
data=[]

directory = 'C:\\Users\\abc\\Desktop\\Testing\\images'
for root, dirs, files in os.walk(directory):
    for file in files:
        floc = file
        im = Image.open(str(directory) + '\\' + floc)
        pix = np.array(im.getdata())
        pixels.append(pix)
        labels.append(1)

pixels = np.array(pixels)
labels = np.array(labels)
traindata.append(pixels)
traindata.append(labels)
traindata = np.array(traindata)
# do the same for validation and test data
# put all data and labels into 'data' array
cPickle.dump(data,open('data.pkl','wb'))

当我运行代码时,我得到以下内容:

Traceback (most recent call last):
  File "pickle_data.py", line 24, in <module>
    traindata=np.array(traindata)
ValueError: could not broadcast input array from shape (22500,3) into shape (1)

我该如何解决这个问题?

感谢。

1 个答案:

答案 0 :(得分:1)

要理解traindata的结构,我将pixels.append(pix)替换为pixels.append(pix[np.ix_([1,2,3],[0,1,2])])以获得一些玩具示例。然后我得到traindata

[array([[[16, 13, 15],
         [16, 13, 15],
         [16, 13, 15]]]), array([1])]

当您尝试将traindata转换为numpy数组时,您会收到错误,因为它包含不同大小的子数组。你可以将每个子数组保存在一个单独的numpy数组中,或者你可以这样做:

traindata = np.array([traindata[0][0],traindata[1]], dtype=object)

通过使用dtype=object,您可以创建由不同大小的元素组成的numpy数组。