0

次の多次元配列があります。最初の軸は 3 次元ベクトルを表します。それぞれの 3 行 3 列の行列 x⋅x' を計算したいと思います。

私の現在の解決策:

arr.shape
# (3, 64, 64, 33, 187)

dm = arr.reshape(3,-1)
dm.shape
# (3, 25276416)

cov = np.empty((3,3,dm.shape[1]))
cov.shape
# (3, 3, 25276416)

この for ループは、25,276,416 個の要素すべてを反復処理し、約 1 ~ 2 分かかります。

for i in range(dm.shape[1]):
    cov[...,i] = dm[:,i].reshape(3,1).dot(dm[:,i].reshape(1,3))

cov = cov.reshape((3,) + arr.shape)
cov.shape
# (3, 3, 64, 64, 33, 187)
4

1 に答える 1

1

まあ、実際にはその行列乗算を使用して軸を減らしているわけではなく、np.dotそこで要素ごとの乗算をブロードキャストしているだけです。NumPy broadcastingしたがって、次のように、単に全体に使用できます-

cov = dm[:,None]*dm

または、直接使用して、作成とそのすべての再arr形成を回避します-dm

cov = arr[:,None]*arr
于 2016-08-12T15:07:27.290 に答える