Python - AttributeError:'numpy.ndarray'对象没有属性'append'

Sim*_*ity 9 python numpy pickle

这关系到我的问题,在这里.

我现在有更新的代码如下:

导入numpy作为np import _pickle作为cPickle从PIL导入图像导入sys,os

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)
Run Code Online (Sandbox Code Playgroud)

当只有一个图像时,代码运行正常.但是,当我添加另一个或更多图像时,我会得到以下结果:

Traceback (most recent call last):
  File "pickle_data.py", line 17, in <module>
    pixels.append((pix))
AttributeError: 'numpy.ndarray' object has no attribute 'append'
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

谢谢.

Rob*_*cia 9

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
Run Code Online (Sandbox Code Playgroud)

例如,如果array_1和array_2具有以下值:

array_1 = np.array([1, 2])
array_2 = np.array([3, 4])
Run Code Online (Sandbox Code Playgroud)

如果在不指定轴值的情况下调用np.append,则如下所示:

array_3 = np.append(array_1, array_2)
Run Code Online (Sandbox Code Playgroud)

array_3将具有以下值:

array([1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)

否则,如果你用轴值为0调用np.append,就像这样:

array_3 = np.append(array_1, array_2, axis=0)
Run Code Online (Sandbox Code Playgroud)

array_3将具有以下值:

 array([[1, 2],
        [3, 4]]) 
Run Code Online (Sandbox Code Playgroud)

有关追加功能的更多信息,请访问:https://docs.scipy.org/doc/numpy/reference/generated/numpy.append.html

  • 不要使用 `np.append`,尤其不要在循环中使用。这是低效的。 (2认同)

hpa*_*ulj 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)???
Run Code Online (Sandbox Code Playgroud)

到目前为止还好.但是,pixels在完成迭代之前,您希望保留为列表.

pixels = np.array(pixels)
labels = np.array(labels)
Run Code Online (Sandbox Code Playgroud)

你在另一个问题上有这个缩进.发生了什么? 以前

迭代,在列表中收集值,然后在最后将事物连接成更大的数组是正确的方法.为了清楚起见,我经常喜欢使用以下符号:

alist = []
for ..
    alist.append(...)
arr = np.array(alist)
Run Code Online (Sandbox Code Playgroud)

如果名称表明对象的性质,我不太可能像你那样得到错误.

我不明白你要做什么traindata.我怀疑你是否需要在循环中构建它. pixelslabels有基本信息.

traindata = np.array([traindata[i][i],traindata[1]], dtype=object)
Run Code Online (Sandbox Code Playgroud)

来自上一个问题.我不确定你理解那个答案.

traindata = []
traindata.append(pixels)
traindata.append(labels)
Run Code Online (Sandbox Code Playgroud)

如果在循环之外完成就是

traindata = [pixels, labels]
Run Code Online (Sandbox Code Playgroud)

labels是一个1d数组,一堆1(或者[0,1,2,3 ...],如果我的猜测是正确的). pixels是一个更高维度的数组.它的形状是什么?

停在那儿.将该列表转换为数组是没有意义的.您可以使用保存列表pickle.

您正在复制先前问题的代码,并且格式错误. cPickle非常大量的数据