【问题标题】:Python - AttributeError: 'numpy.ndarray' object has no attribute 'append'Python - AttributeError:'numpy.ndarray'对象没有属性'append'
【发布时间】:2017-08-14 01:03:11
【问题描述】:

这与我的问题有关,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'

我该如何解决这个问题?

谢谢。

【问题讨论】:

  • traindata = np.array([traindata[i][i],traindata[1]], dtype=object) - 你为什么要这样做?这没有任何意义。

标签: python numpy pickle


【解决方案1】:

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])

否则,如果您调用 np.append 时轴值为 0,如下所示:

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

【讨论】:

  • 他还可以避免在循环期间将列表转换为数组(即将像素 = np.array(pixels) 移动到循环结束)
  • 不要使用np.append,尤其不要在循环中使用。效率低下。
【解决方案2】:
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 做什么。我怀疑您是否需要在循环期间构建它。 pixelslabels有基本信息。

那个

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

来自上一个问题。我不确定你是否理解这个答案。

traindata = []
traindata.append(pixels)
traindata.append(labels)

如果在循环外完成就只是

traindata = [pixels, labels]

labels 是一个一维数组,一堆 1(如果我的猜测是正确的,也可以是 [0,1,2,3...])。 pixels 是一个高维数组。它的形状是什么?

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

您正在复制先前问题中的代码,并且格式错误。 cPickle very large amount of data

【讨论】:

    【解决方案3】:

    ndarray 上的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]]
    

    【讨论】:

      【解决方案4】:

      pixels = np.array(pixels) 在此行中您重新分配 pixels。所以,无论如何它可能不是一个列表。尽管pixels 不是一个列表,但它没有append 属性。是否有意义?

      【讨论】:

        猜你喜欢
        • 2020-12-08
        • 1970-01-01
        • 2020-12-29
        • 2018-06-22
        • 2015-08-16
        • 2015-03-08
        • 1970-01-01
        • 2019-11-09
        • 2013-11-05
        相关资源
        最近更新 更多