【问题标题】:ValueError: could not broadcast input array from shape (22500,3) into shape (1)ValueError:无法将输入数组从形状 (22500,3) 广播到形状 (1)
【发布时间】:2017-03-22 02:31:37
【问题描述】:

我依赖于提到的代码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)

我该如何解决这个问题?

谢谢。

【问题讨论】:

    标签: python pickle


    【解决方案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数组。

    【讨论】:

    • 非常感谢。你能解释一下 [0][0] 在这里指的是什么吗?我相信返回的结果与“pixels = np.array(pixels)”相同。我们如何将像素和标签值组合在一起,尤其是在示例中附加它们。
    • @Simplicity,查看我的更新。我认为如果你想将它们保存为 numpy 数组,你应该单独保存它们。
    • @Simplicity,参见“编辑”部分。这似乎可行,并允许使用不同大小的对象创建 numpy 数组。
    • 太棒了!非常感谢您的支持。
    猜你喜欢
    • 1970-01-01
    • 2020-01-11
    • 2018-06-30
    • 2018-06-08
    • 2020-01-21
    • 2020-10-18
    • 2018-09-25
    • 2018-04-21
    • 2020-10-09
    相关资源
    最近更新 更多