这与我的问题here有关。
我现在有更新的代码如下:
import numpy as np
import _pickle as cPickle
from PIL import Image
import sys,os
pixels = []
labels = []
traindata = []
i = 0
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[i][i],traindata[1]], dtype=object)
i = i + 1
# do the same for validation and test data
# put all data and labels into 'data' array
cPickle.dump(traindata,open('data.pickle','wb'))
FILE = open("data.pickle", 'rb')
content = cPickle.load(FILE)
print (content)
当只有一个图像时,代码运行正常。但是,当我添加另一个或更多图像时,我得到以下内容:
Traceback (most recent call last):
File "pickle_data.py", line 17, in <module>
pixels.append((pix))
AttributeError: 'numpy.ndarray' object has no attribute 'append'
我该如何解决这个问题?
感谢。
答案 0 :(得分:8)
Numpy数组没有append方法。请改用Numpy追加功能:
import numpy as np
array_3 = np.append(array_1, array_2, axis=n)
# you can either specify an integer axis value n or remove the keyword argument completely
例如,如果array_1和array_2具有以下值:
array_1 = np.array([1, 2])
array_2 = np.array([3, 4])
如果你调用np.append而没有指定轴值,如下所示:
array_3 = np.append(array_1, array_2)
array_3将具有以下值:
array([1, 2, 3, 4])
否则,如果你用轴值0调用np.append,就像这样:
array_3 = np.append(array_1, array_2, axis=0)
array_3将具有以下值:
array([[1, 2],
[3, 4]])
有关追加功能的更多信息,请访问:https://docs.scipy.org/doc/numpy/reference/generated/numpy.append.html
答案 1 :(得分:5)
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) # append(i)???
到目前为止还好。但是您希望将pixels
作为列表保留,直到完成迭代。
pixels = np.array(pixels)
labels = np.array(labels)
你在另一个问题上有这个缩进。发生了什么? previous
迭代,在列表中收集值,然后在最后将事物连接成更大的数组是正确的方法。为了清楚起见,我经常喜欢使用以下符号:
alist = []
for ..
alist.append(...)
arr = np.array(alist)
如果名称表明对象的性质,我不太可能像你那样得到错误。
我不明白你要对traindata
做些什么。我怀疑你是否需要在循环中构建它。 pixels
和labels
有基本信息。
这
traindata = np.array([traindata[i][i],traindata[1]], dtype=object)
来自上一个问题。我不确定你理解这个答案。
traindata = []
traindata.append(pixels)
traindata.append(labels)
如果在循环之外完成只是
traindata = [pixels, labels]
labels
是一个1d数组,一堆1(或者[0,1,2,3 ...],如果我的猜测是正确的)。 pixels
是一个更高维度的数组。它的形状是什么?
停在那儿。将该列表转换为数组是没有意义的。您可以使用pickle
保存列表。
您正在复制先前问题的代码,并且格式错误。 cPickle very large amount of data
答案 2 :(得分:1)
append
含糊不清;您要将数据追加到哪个轴?如果不准确了解您的数据是什么样的,我只能提供一个使用numpy.concatenate
的示例,我希望这会有所帮助:
import numpy as np
pixels = np.array([[3,3]])
pix = [4,4]
pixels = np.concatenate((pixels,[pix]),axis=0)
# [[3 3]
# [4 4]]
答案 3 :(得分:1)
pixels = np.array(pixels)
在此行中您重新分配pixels
。所以,无论如何它可能不是一个列表。虽然pixels
不是列表,但它没有属性append
。是否有意义?