

python初心者です。  
numpyで計算したnvという結果を棒グラフに表そうとしてます。

[code]

    import numpy as np
    
    nv_fw = np.longdouble(0)
    nv_df = np.longdouble(0)
    for trial in nv :
        for i in range(0,len(trial)-1):  
            nv_fw_dist = np.linalg.norm(trial.iloc[i,1:3]-trial.iloc[i+1, 1:3])
    
            nv_df_dist = np.linalg.norm(trial.iloc[i,3:5]-trial.iloc[i+1,3:5])
    
            if np.isnan(nv_df_dist):
                print(trial)
                break
            nv_fw += nv_fw_dist
            nv_df += nv_df_dist
           # print(nv_fw,   nv_df)
    
    plt.bar(range(len(nv_fw)),nv_fw,color=[1,0,0])
    
[/code]

このようにコードを書くと以下のようなエラーが表示されます。

[code]

    TypeError: object of type 'numpy.float128' has no len()
    
[/code]

どのようにエラーを解消することができますでしょうk


CC BY-SA 4.0
2018-11-21T01:04:23.947
50484
2018-11-22T07:34:26.780
2018-11-21T01:09:21.900
3060
30230
question
python python3 numpy
エラー文を解消したいです。object of type 'numpy.float128' has no len()


おことわり：[質問に書かれたコードに変数nvなどを定義している部分が見当たらないので、推測を含んだ回答となっています]

[code]

    for trial in nv :
        for i in range(0,len(trial)-1):  
    
[/code]

の"len(trial)"の部分で、「TypeError: object of type 'numpy.float128' has no
len()」というエラーが発生する事から、  
・trialの型は、128bit浮動小数点数(longdouble)である。  
・nvは、longdoubleのリスト(配列）である。  
という事が判ります。

そして、nvというリストの値をグラフに表すのであれば

[code]

    plt.bar(range(0,len(nv)-1),nv)
    
[/code]

で足ります。（x軸上の数値は、"0,1,2..."になります）

ところが、

[code]

    nv_fw_dist = np.linalg.norm(trial.iloc[i,1:3]-trial.iloc[i+1, 1:3])
    
[/code]

のように、nvが二次元配列のリストと想定されているようなコードも含まれています。

これらからアドバイスできることは、「nvの定義を見直すべき」です。  
そして、見直し後のnvの定義に沿うようにコードを修正すれば、エラーはなくなると思います。

=== 質問者から 変数 nv について、以下のように回答がありましたので、回答に追記します(コードは読みやすいように整形しています) ===

[code]

    nv= [] 
    pattern = r'\d{1,2}(_0)' 
    for file in os.listdir('./DATA.csv/'):
        if file.endswith('.csv')and re.match(pattern, file):
            nv.append(pd.read_csv('./DATA.csv/'+file,skiprows=2,usecols=[0,3,4,5,6]).dropna())
            print(re.match(pattern,file)) 
    
[/code]

このコードから変数nvは、５つの値から成る配列の配列（[[1,2,3,4,5][1,2.3,4,6,3][3,4,11,2,9].....]のような感じ）だと判断できます。

===  
ここで元のコードを最後のほうから見てゆきます。

[code]

    plt.bar(range(len(nv_fw)),nv_fw,color=[1,0,0])
    
[/code]

matplotlib.pyplot.bar の第１引数は各棒の位置(X軸）のリスト、第２引数は各棒の高さ(Y軸）のリスト(両方とも必須）なので

[code]

    plt.bar(nv_fw,nv_df,color=[1,0,0])
    
[/code]

というような感じで、nv_fwとnv_dfは数値の配列にしないといけない。

だから、

[code]

    // 初期化
    nv_fw = np.longdouble(0)
    nv_df = np.longdouble(0)
    // ループの内部
    nv_fw += nv_fw_dist
    nv_df += nv_df_dist
    
[/code]

のように合計を求めてゆくのではなく、

[code]

    // 初期化
    nv_fw = []
    nv_df = []
    // ループの内部
    nv_fw.append(nv_fw_dist)
    nv_df.append(nv_df_dist)
    
[/code]

のように数値をリストに追加していくようにしないといけない。

===  
nvからデータを作っていくところは、nvの要素（５つの数値のリスト）を順に取り出して(nv[i])、さらに５つの数値のうちの最初の３つの差からnv_fw_distを、最後の３つの差からnv_df_distを、それぞれ二次元ノルム（ユークリッド・ノルム）を算出するようなので

[code]

    for i in range(0,len(nv)-1): // iがnvの１次元のインデックスのループ（配列のインデックスは１ではなく0から始まることに注意）
        nv_fw_dist = np.linalg.norm(np[i][0:2]-np[i+1][0:2])
        nv_df_dist = np.linalg.norm(np[i][2:4]-np[i+1][2:4])
        nv_fw.append(nv_fw_dist)
        nv_df.append(nv_df_dist)
    
[/code]

という感じかな。

＝＝ 感想 ＝＝  
nvを定義するコードと、質問に書かれたコードは、相矛盾する箇所がいくつもあります。  
そうした矛盾が解消できるように考えていった過程が、上に書いたような事です。

５つの数値から、３つの数値の組を２つ作る（１つの数値は両方の組で使われる）というのは、あまり見かけないデータ構造だと思います。  
ひょっとすると、csvから６つの数値（nv_fw_dist用に３個、nv_df_dist用に３個）を取り出して、６個の数値のリストをつくるのではないのかなと思いました。

質問の最初に、そもそも何をするプログラムで、どんな意味を持つデータ(csvファイル）が入力として使われ、どんな出力を期待しているのか、といった情報があれば、良かったと思います。


CC BY-SA 4.0
2018-11-21T01:48:17.063
50485
2018-11-22T07:34:26.780
2018-11-22T07:34:26.780
217
217
50484
answer