47085


> line 53, in FNN  
>  b[n, m] = np.dot(w[m, :], np.r_[x[n, :], 1])
>
> IndexError: too many indices for array

このようなエラーコードが発生してしまいます。コードは下に記載してあります。これはどういう意味のエラーコードなのでしょうか？また、解決策はありますでしょうか？まだプログラミング勉強中なので、回答はお手柔らかにお願いいたします。

[code]

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    data_dir = r"C:\Users\nagat\Documents"
    data = pd.read_csv(data_dir + r"\usdjpy_d.csv")
    data.head()
    
    data2 = np.array(data)
    
    K = 2
    M = 2
    N = 10
    D = 25
    X = np.zeros((N, D))
    T = np.zeros((N, K), dtype=np.uint8)
    
    for n in range(N):
        for d in range(D):
            X[n, d] = data2[len(data2) - n*D - (D - d) - 1, 4]
    
    for n in range(N):
        tomorrow = data2[len(data2) - n*D - (D - d), 4]
        if tomorrow < X[n, D - 1]:
            T[n, :] = [1, 0]
        if tomorrow > X[n, D - 1]:
            T[n, :] = X[0, 1]
    
    X_n = 8
    X_train = X[:X_n, :]
    T_train = T[:X_n, :]
    X_test = X[X_n:, :]
    T_test = T[X_n:, :]
    
    def Sigmoid(x):
        z = 1 / np.exp(-x)
        return z
    
    def FNN(wv, M, K, x):
        N, D = x.shape
        w = wv[:M * (D+1)]
        w.reshape(M, (D+1))
        v = wv[M * (D+1):]
        v.reshape((K, M+1))
    
        b = np.zeros((N, M+1))
        z = np.zeros((N, M+1))
        a = np.zeros((N, K))
        y = np.zeros((N, K))
    
        for n in range(N):
            for m in range(M):
                b[n, m] = np.dot(w[m, :], np.r_[x[n, :], 1])
    
        for m in range(M):
            for n in range(N-1):
                z[n, m] = (z[n, m] + Sigmoid(b[n+1, m])) / n
    
        for n in range(N):
            z[n, M-1] = 1
            for k in range(K):
                a[n, k] = np.dot(v[k, :], np.r_[z[n, :], 1])
            u = 0
            for k in range(K):
                u = u + np.exp(a[n, k])
                y[n, k] = np.exp(a[n, k]) / u
        return y, a, z, b
    
    def CrossEntropy(wv, M, K, x, t):
        N, D = x.shape
        y, a, z, b = FNN(wv, M, K, x)
        ce = -np.dot(np.log(y.reshape(-1)), t.reshape(-1))
        return ce
    
    nWV = M*(D + 1) + K*(M + 1)
    np.random.seed(1)
    WV = np.random.normal(0, 1, nWV)
    
    CE = CrossEntropy(WV, M, K, X_train, T_train)
    print(CE)
    
[/code]


CC BY-SA 4.0
2018-07-28T15:55:10.873
47062
2018-07-30T01:02:29.490
2018-07-30T01:02:29.490
15171
29506
question
python python3
エラーコード「IndexError: too many indices fo array」


エラーコード`IndexError: too many indices for
array`で、`IndexError`は、ドキュメントでは、「シーケンスの添字が範囲外の場合に送出されます。
(スライスのインデクスはシーケンスの範囲に収まるように暗黙のうちに調整されます; インデクスが整数でない場合、 TypeError
が送出されます。)」となっています。

`too many indices for array`は、スライスのインデックスの次元が配列の次元よりも大きいということで、例えば1次元配列を`w[m,
:]`のようにインデックスが2次元でスライスしようとすると発生します。

エラーの発生原因は、コメントにあるように`w.reshape(M,
(D+1))`で`w`を2次元の配列に変更したように見えますが、実際には`w`は変更されません。`w = w.reshape(M,
(D+1))`と代入する必要があります。

このような思い込みによるバグはよくあるので、デバッガーを使ってエラーが発生している場所にブレクポイントを設定してデバッグをすると原因がわかりやすいです。Pythonの場合は、`pdb`というPythonデバッガが標準で添付されています。どのエディターを使っていてもデバッガーを使うことができます。


CC BY-SA 4.0
2018-07-30T01:00:54.453
47085
2018-07-30T01:00:54.453
15171
47062
answer