web-dev-qa-db-fra.com

Python - AttributeError: l'objet 'numpy.ndarray' n'a pas d'attribut 'append'

Ceci est lié à ma question, ici .

J'ai maintenant le code mis à jour comme suit:

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)

Lorsqu'il n'y a qu'une image, le code fonctionne correctement. Mais, lorsque j'ajoute une ou plusieurs images, je reçois le texte suivant:

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

Comment puis-je résoudre ce problème?

Merci.

9
Simplicity
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)???

Jusqu'ici ok. Mais vous voulez laisser pixels sous forme de liste jusqu'à la fin de l'itération.

pixels = np.array(pixels)
labels = np.array(labels)

Vous avez eu cette affirmation juste dans votre autre question. Qu'est-il arrivé? précédent

Itérer, collecter des valeurs dans une liste, puis, à la fin, joindre des éléments dans un tableau plus grand est la bonne solution. Pour clarifier les choses, je préfère souvent utiliser des notations telles que:

alist = []
for ..
    alist.append(...)
arr = np.array(alist)

Si les noms indiquent quelque chose sur la nature de l'objet, je suis moins susceptible de recevoir des erreurs comme la vôtre.

Je ne comprends pas ce que vous essayez de faire avec traindata. Je doute que vous ayez besoin de le construire pendant la boucle. pixels et labels ont les informations de base.

Cette

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

vient de la question précédente. Je ne suis pas sûr que vous compreniez cette réponse.

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

si cela est fait en dehors de la boucle est juste

traindata = [pixels, labels]

labels est un tableau 1d, un groupe de 1 (ou [0,1,2,3 ...] si ma proposition est correcte). pixels est un tableau de dimension supérieure. Quelle est sa forme?

Arrête toi là. Il ne sert à rien de transformer cette liste en tableau. Vous pouvez enregistrer la liste avec pickle.

Vous copiez le code d'une question précédente et vous vous trompez de mise en forme. cPickle très grande quantité de données

5
hpaulj

Les tableaux Numpy n'ont pas de méthode append. Utilisez plutôt la fonction Numpy append:

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

Par exemple, si array_1 et array_2 ont les valeurs suivantes:

array_1 = np.array([1, 2])
array_2 = np.array([3, 4])

Si vous appelez np.append sans spécifier de valeur d'axe, procédez comme suit:

array_3 = np.append(array_1, array_2)

array_3 aura la valeur suivante:

array([1, 2, 3, 4])

Sinon, si vous appelez np.append avec une valeur d'axe égale à 0, comme suit:

array_3 = np.append(array_1, array_2, axis=0)

array_3 aura la valeur suivante:

 array([[1, 2],
        [3, 4]]) 

Plus d'informations sur la fonction append ici: https://docs.scipy.org/doc/numpy/reference/generated/numpy.append.html

9
Robert Valencia

append sur un ndarray est ambigu; à quel axe voulez-vous ajouter les données? Sans savoir précisément à quoi ressemblent vos données, je ne peux donner qu'un exemple en utilisant numpy.concatenate que j'espère aidera:

import numpy as np

pixels = np.array([[3,3]])
pix = [4,4]
pixels = np.concatenate((pixels,[pix]),axis=0)

# [[3 3]
#  [4 4]]
1
Crispin

pixels = np.array(pixels) dans cette ligne, vous réaffectez pixels. Donc, il se peut que ce ne soit pas une liste de toute façon. Bien que pixels ne soit pas une liste, il n'a pas d'attribut append. Est-ce que ça fait du sens?

1
Ashraful Islam