

プログラミングを始めたばかりの初心者です。  
画像診断のプログラムを組みたいのですが、下記のようなエラーが出てしまいます。  
google colaboratoryを使用しており、kaggleのChest X-Ray Images
(Pneumonia)というデータセットから何枚かgoogleドライブにアップロードして使おうとしています。  
他の方の質問も見てみましたが、理解が追い付かず...  
解決方法を教えていただければ幸いです。  
（appendの代わりにnp.appendを入れたりしましたが、そちらでもエラーが出てしまいました。）

[code]

    import numpy as np
    import tensorflow as tf
    from tensorflow import keras
    import glob
    
    x_train = []
    y_train = []
    x_test = []
    y_test = []
    
    for f in glob.glob("/content/drive/MyDrive/kaggle/image/*/*/*.jpeg"):
        img_data = tf.io.read_file(f)
        img_data = tf.io.decode_jpeg(img_data)
        img_data = tf.image.resize(img_data,(100,100))
      
        if f.split("/")[6]=="train":
            x_train.append(img_data)
            y_train.append(int(f.split("/")[7].split("_")[0]))
        elif f.split("/")[6]=="test":
              x_test.append(img_data)
              y_test.append(int(f.split("/")[7].split("_")[0]))
        
        x_train = np.array(x_train) / 255.0
        y_train = np.array(y_train)
        x_test = np.array(x_test) / 255.0
        y_test = np.array(y_test)
    
[/code]

[code]

    AttributeError                            Traceback (most recent call last)
    <ipython-input-75-44f0c41d960e> in <module>()
         18         y_train.append(int(f.split("/")[7].split("_")[0]))
         19     elif f.split("/")[6]=="test":
    ---> 20           x_test.append(img_data)
         21           y_test.append(int(f.split("/")[7].split("_")[0]))
         22 
    
    AttributeError: 'numpy.ndarray' object has no attribute 'append'
    
[/code]


CC BY-SA 4.0
2022-02-13T08:01:42.800
86311
2022-02-13T09:56:58.623
2022-02-13T08:14:44.827
26370
51404
question
python
'numpy.ndarray' object has no attribute 'append'のエラーが出てしまいます。


紹介された動画のコーディング作業画像を良く見ると、ほんの一瞬ですが該当部分のインデントを減らして`for`ループの外に移動させていました。  
`19:00`・`20:26`付近や`21:52`以後など

なので、以下の部分のインデントを解除して`for`ループの外に移動すれば動作するでしょう。

[code]

        x_train = np.array(x_train) / 255.0
        y_train = np.array(y_train)
        x_test = np.array(x_test) / 255.0
        y_test = np.array(y_test)
    
[/code]

単純にこちらのようにする。

[code]

    x_train = np.array(x_train) / 255.0
    y_train = np.array(y_train)
    x_test = np.array(x_test) / 255.0
    y_test = np.array(y_test)
    
[/code]

* * *

以下は動画が紹介される前のソースコードだけで推測した内容です。  
一応何か別の現象が起こった時などのための注意事項として残しておきます。

* * *

お手本の記事へのリンクとかソースコードの情報が追加されるかどうか分かりませんが、今のソースコードからすると、問題の原因は以下のコードによりPythonの基本的なリストとして定義された変数がnumpy.ndarrayに変換されてしまったことですね。  
例えばこちらの記事と類似の現象です。  
['numpy.ndarray' object has no attribute
'append'のエラーについて](https://ja.stackoverflow.com/q/69976/26370)

リストとしての宣言と初期化

[code]

    x_train = []
    y_train = []
    x_test = []
    y_test = []
    
[/code]

forループでの処理でndarrayに変換される

[code]

        x_train = np.array(x_train) / 255.0
        y_train = np.array(y_train)
        x_test = np.array(x_test) / 255.0
        y_test = np.array(y_test)
    
[/code]

なので、forループの初回は以下の処理は正常に動作しますが、2回目以後はリストでは無くndarrayになっているのでエラーになります。

[code]

        if f.split("/")[6]=="train":
            x_train.append(img_data)
            y_train.append(int(f.split("/")[7].split("_")[0]))
        elif f.split("/")[6]=="test":
              x_test.append(img_data)
              y_test.append(int(f.split("/")[7].split("_")[0]))
    
[/code]

最初からndarrayとして宣言・初期化しnp.appendを使うか、ループ後半のリスト全体をndarrayに変換してしまう処理を見直して必要なデータだけndarrayに変換するよう書き変えるか、のどちらかになると思われます。


CC BY-SA 4.0
2022-02-13T09:10:52.290
86314
2022-02-13T09:56:58.623
2022-02-13T09:56:58.623
26370
26370
86311
answer