1. ホーム
  2. python

[解決済み】Python、タプルのインデックスはタプルではなく、整数でなければならない?

2022-02-12 19:01:06

質問

何が起こっているのか全くわからないのですが、なぜかPythonがこれを投げてくるんです。参考までに、これは私が遊びで作っている小さなニューラルネットワークの一部ですが、np.arrayなどをたくさん使っているので、たくさんの行列が投げられており、ある種のデータ型の衝突を作り出していると思われます。多分、誰かがこれを解決するのを助けてくれるでしょう。なぜなら、私はそれを修正することができずに、あまりにも長い間このエラーを見つめてきたからです。

#cross-entropy error
#y is a vector of size N and output is an Nx3 array
def CalculateError(self, output, y): 

    #calculate total error against the vector y for the neurons where output = 1 (the rest are 0)
    totalError = 0
    for i in range(0,len(y)):
       totalError += -np.log(output[i, int(y[i])]) #error is thrown here

    #now account for regularizer
    totalError+=(self.regLambda/self.inputDim) * (np.sum(np.square(self.W1))+np.sum(np.square(self.W2)))     

    error=totalError/len(y) #divide ny N
    return error

yは長さ150のベクトルで、テキスト文書から直接取得したものです。yの各インデックスには1、2、3のいずれかのインデックスが含まれています。

#forward propogation algorithm takes a matrix "X" of size 150 x 3
def ForProp(self, X):            
        #signal vector for hidden layer
        #tanh activation function
        S1 = X.dot(self.W1) + self.b1
        Z1 = np.tanh(S1)

        #vector for the final output layer
        S2 = Z1.dot(self.W2)+ self.b2
        #softmax for output layer activation
        expScores = np.exp(S2)
        output = expScores/(np.sum(expScores, axis=1, keepdims=True))
        return output,Z1

解決方法は?

あなたの output 変数は N x 4 の行列は、少なくとも パイソン型 の意味です。それは タプル そして、タプル(間にコマのある2つの数字)でインデックスを作ろうとしていますが、これはnumpyの行列に対してのみ機能します。出力を表示して、問題が単なる型なのか(それならnp.arrayに変換すればいい)、それとも全く異なるものを渡しているのか(それなら何が原因であれ修正してください)を判断してください。 output ).

実施例

import numpy as np
output = ((1,2,3,5), (1,2,1,1))

print output[1, 2] # your error
print output[(1, 2)] # your error as well - these are equivalent calls

print output[1][2] # ok
print np.array(output)[1, 2] # ok
print np.array(output)[(1, 2)] # ok
print np.array(output)[1][2] # ok