Python-AttributeError: 'numpy.объект ndarray не имеет атрибута "append"

Это связано с моим вопросом, здесь.

теперь у меня есть обновленный код следующим образом:

импорт numpy как np импортировать _pickle как cPickle из PIL импорт изображения импорт sys, os

pixels = []
labels = []
traindata = []
i = 0

directory = 'C:UsersabcDesktopTestingimages'
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'

Как я могу решить эту проблему?

спасибо.

4 ответов


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)

у вас был этот отступ прямо в вашем другом вопросе. Что случилось?

итерация, сбор значений в списке, а затем в конце объединение вещей в больший массив-правильный путь. Чтобы прояснить ситуацию, я часто предпочитаю использовать обозначения, такие как:

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 - это массив 1д, куча 1s (или [0,1,2,3...] если моя догадка верна). pixels высшие измерения. Какова его форма?

Остановись здесь. Нет смысла превращать этот список в массив. Вы можете сохранить список с помощью pickle.

вы копируете код из более раннего вопроса и получаете неправильное форматирование. cPickle очень большой объем данных


массивы Numpy не имеют метода добавления. Вместо этого используйте функцию 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

например, если array_1 и array_2 имеют следующие значения:

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

если вы вызываете np.добавьте без указания значения оси, например:

array_3 = np.append(array_1, array_2)

array_3 будет иметь следующее значение:

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

Else, если вы вызываете np.добавьте значение оси 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


append на ndarray неоднозначно; к какой оси вы хотите добавить данные? Не зная точно, как выглядят ваши данные, я могу привести только пример, используя 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]]

pixels = np.array(pixels) в этой строке можно переназначать pixels. Таким образом, это может быть не список. Хотя pixels это не список, у него нет атрибутов append. В этом есть смысл?