0

これは私の最初の質問なので、私が犯すと確信している投稿ミスについて心からお詫び申し上げます。最初に以前に回答された質問を検索しましたが、正しい用語やキーワードを使用して検索しなかった可能性があることは認識していますが、適切な解決策が見つかりませんでした。

Python ですばやく評価したい一般的な関数があります。これはオプティマイザー (fmin_cobyla) に渡されますが、引数を 1 つだけ取りたいと思います。フラグによって制御される可能性のあるこの関数のさまざまなバリエーション (バリアント? フレーバー?) を使用するオプションを使用できるようにしたいと考えています。すぐに評価したいので、関数内に多数の if または case ステートメントを含めるのは意味がありません (そうですか?)。そのため、現在、関数バリアントの定義の周りに if ステートメントがあります。

if flag==1:
    def f(x):
        for i in range(0,len(x)*3,3):
            A[i:i+3,i:i+3]=1/x[i/3]*np.eye(3)
        tmp=np.linalg.solve(A,b)
        y=somecmodulefunction(tmp)
        return y
elif flag==2:
    def f(x):
        for i in range(0,len(x)*3,3):
            A[i:i+3,i:i+3]=x[i/3]*np.eye(3)
        tmp=np.linalg.solve(A,b)
        y=somecmodulefunction(tmp)
        return y
...

機能は、1 行を除いて同じです。これは正しい方法ですか?10個の異なるバリアントがある場合、それが長くて扱いにくいコードブロックにならないようにする方法はありますか?

ありがとう!

4

2 に答える 2

0

できるだけ繰り返さないようにしてください。これは、その式の反転である違いのみを指定することを意味します。残りは同じです。何かの計算方法を変更したい場合は、1 か所で変更するだけで済みます。

def f(x, flag):
    for i in range(0,len(x)*3,3):
        temp = x[i/3]*np.eye(3)
        if flag-2:
            temp = 1/temp
        A[i:i+3,i:i+3] = temp
    tmp=np.linalg.solve(A,b)
    y=somecmodulefunction(tmp)
    return y

flagisの場合、 equalsは誤った値であるため2if分岐は実行されません。isの場合、 equalsは真の値であるため、分岐が実行されます。ただし、ブール値フラグを使用することをお勧めします (つまり、またはの値を期待する)。これにより、反転が必要であることを示すことができます。2-20flag1if1-2-1TrueFalseif flag:True

于 2015-06-13T23:53:50.997 に答える