1
>>> import numpy as np
>>> X = np.arange(27).reshape(3, 3, 3)
>>> x = [0, 1]
>>> X[x, x, :]
array([[ 0,  1,  2],
       [12, 13, 14]])

次元に沿って合計する必要があります0が、実際には行列は巨大であり-1、メモリレイアウトのために高速な次元に沿って合計することをお勧めします。したがって、結果を転置したいと思います。

array([[ 0, 12],
       [ 1, 13],
       [ 2, 14]])

それ、どうやったら出来るの?numpy の「高度なインデックス作成」の結果を暗黙的に転置したいと思います。最後に明示的に転置する.Tとさらに遅くなり、オプションではありません。

Update1 : 現実の世界では、高度なインデックス作成は避けられず、添え字が同じであるとは限りません。

>>> x = [0, 0, 1]
>>> y = [0, 1, 1]
>>> X[x, y, :]
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [12, 13, 14]])

Update2 : これがXY の問題ではないことを明確にするために、実際の問題は次のとおりです。

ある確率分布からのX要素を含む大きな行列があります。x要素の確率分布は、要素の近傍に依存します。この分布は不明なので、ギブズ サンプリング手順に従って、この分布の要素を持つ行列を作成します。簡単に言えば、行列の初期推定を行ってからX、行列の要素を反復し続け、各要素を の隣接する値に依存する式でX更新することを意味します。したがって、行列の任意の要素について、その近傍を取得し (高度なインデックス付け)、それらに対して何らかの操作を実行する必要があります (私の例では合計)。利用したxxline_profiler私のコードでほとんどの時間を費やしている行が、0ではなく次元に関して配列の合計を取っていることを確認してください-1。したがって、高度なインデックス付けの結果として、既に転置された行列を生成する方法があるかどうかを知りたいです。

4

1 に答える 1