1

たとえば、(1,2,3,4,5,6) のような形状の結合確率質量関数配列があり、いくつかの次元の値を条件として確率テーブルを計算したい (cpt をエクスポートする) 、意思決定の目的で。

現時点で思いついたコードは次のとおりです(入力は {'variable_1': value_1, 'variable_2': value_2 ... } の形式の辞書「vdict」です)

for i in vdict:
   dim = self.invardict.index(i) # The index of the dimension that our Variable resides in
   val = self.valdict[i][vdict[i]] # The value we want it to be
   d = d.swapaxes(0, dim)
   **d = array([d[val]])**
   d = d.swapaxes(0, dim)

...

だから、私が現在していることは次のとおりです。

  1. 変数をcptの対応する次元に変換します。
  2. 0 番目の軸を前に見つけた軸と入れ替えます。
  3. 0軸全体を目的の値に置き換えます。

寸法を元の軸に戻します。

さて、問題は、ステップ 2 を実行するために、(a.) サブ配列を計算し、(b.) それをリストに入れて再び配列に変換する必要があるため、新しい配列が得られることです。

つまり、太字のものは、古いオブジェクトへの参照だけを使用する代わりに、新しいオブジェクトを作成することを意味します。これは、d が非常に大きく (これは私に起こります)、d を使用するメソッドが何度も呼び出される場合です (これもまた、 、私に起こります)結果全体が非常に遅いです。

では、この小さなコードを改良してより高速に実行できるアイデアを思いついた人はいますか? たぶん、その場で条件を計算できるようになるでしょう。

注:元の軸の順序を維持する必要があります(または、少なくとも、軸が削除されたときに変数をディメンション辞書に更新する方法を確認してください)。カスタムdtypeに頼りたくありません。

4

1 に答える 1

1

わかりました、numpy のインプレース配列操作で少し遊んだ後、自分で答えを見つけました。

ループの最後の 3 行を次のように変更しました。

    d = conditionalize(d, dim, val)

conditionalize は次のように定義されます。

    def conditionalize(arr, dim, val):
        arr = arr.swapaxes(dim, 0)
        shape = arr.shape[1:]       # shape of the sub-array when we omit the desired dimension.
        count = array(shape).prod() # count of elements omitted the desired dimension.
        arr = arr.reshape(array(arr.shape).prod()) # flatten the array in-place.
        arr = arr[val*count:(val+1)*count] # take the needed elements
        arr = arr.reshape((1,)+shape) # the desired sub-array shape.
        arr = arr. swapaxes(0, dim)   # fix dimensions

        return arr

これにより、プログラムの実行時間が 15 分から 6 秒に短縮されました。莫大な利益。

これが同じ問題に遭遇した人に役立つことを願っています。

于 2010-02-07T20:23:28.037 に答える