4

私はこのpythonコード(動作する)に出くわしましたが、私には素晴らしいようです。ただし、このコードが何をしているのかわかりません。それを再現するために、私はテストコードを書きました:

import numpy as np

# Create a random array which represent the 6 unique coeff. 
# of a symmetric 3x3 matrix
x = np.random.rand(10, 10, 6)

したがって、100 個の対称 3x3 マトリックスがあり、一意のコンポーネントのみを保存しています。ここで、完全な 3x3 マトリックスを生成したいと思います。ここで魔法が起こります。

indices = np.array([[0, 1, 3],
                    [1, 2, 4],
                    [3, 4, 5]])

これが何をしているのかがわかります。これは、0 ~ 5 のインデックス コンポーネントを 3x3 マトリックスに配置して対称マトリックスにする方法です。

mat = x[..., indices]

この行は私を失いました。したがって、x配列の最後の次元で作業していますが、再配置と再形成がどのように行われるかはまったくわかりませんが、これは実際に形状の配列(10、10、3、3)を返します。ビックリ&戸惑います!

4

1 に答える 1

1

高度なインデックス作成のドキュメントから - bi rico のリンク。

x.shape が (10,20,30) で ind が (2,3,4) 形状のインデックス intp 配列であると仮定すると、result = x[...,ind,:] の形状は (10,2,3, 4,30) (20,) 形状の部分空間が (2,3,4) 形状のブロードキャストされたインデックス付け部分空間に置き換えられたためです。i、j、k を (2,3,4) 型の部分空間でループさせると、result[...,i,j,k,:] =x[...,ind[i,j,k] 、:]。この例では、x.take(ind, axis=-2) と同じ結果が生成されます。

于 2015-01-09T08:49:32.020 に答える