web-dev-qa-db-ja.com

Python-AttributeError: 'numpy.ndarray'オブジェクトに属性 'append'がありません

これは私の質問 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)

画像が1つしかない場合、コードは正常に実行されます。しかし、別の画像以上を追加すると、次のようになります:

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

この問題を解決するにはどうすればよいですか?

ありがとう。

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

これまでのところ大丈夫。ただし、反復が完了するまで、pixelsをリストのままにしておきます。

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

他の質問でもこのインデントがありました。どうした?

反復し、値をリストに収集し、最後に物をより大きな配列に結合するのが正しい方法です。物事を明確にするために、私はしばしば次のような表記を使用することを好みます:

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次元配列で、1の集まりです(推測が正しければ[0,1,2,3 ...])。 pixelsは高次元の配列です。その形は何ですか?

すぐに停止します。そのリストを配列に変える意味はありません。 pickleを使用してリストを保存できます。

以前の質問からコードをコピーして、フォーマットを間違えています。 cPickle非常に大量のデータ

5
hpaulj

Numpy配列にはappendメソッドがありません。代わりに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.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

9
Robert Valencia

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]]
1
Crispin

pixels = np.array(pixels)この行では、pixelsを再割り当てします。だから、それはとにかくリストではないかもしれません。 pixelsはリストではありませんが、属性appendはありません。理にかなっていますか?

1
Ashraful Islam