0

次元 4 の上三角部分配列があります。次のように初期化されます。

N, Q = (99, 23)
bivariate = np.zeros((N,N,Q,Q))

そして、次のようなものが入力されます

for i in range(N):
    for j in range(i+1,N):
        bivariate[i,j] = num

上三角要素を正規化された (Q,Q) 行列にしたい。私は現在、これを行うだけでこれを行っています

bivariate /= bivariate.sum(axis=3).sum(axis=2)[:,:,np.newaxis,np.newaxis]

しかし、下三角部分の空の配列が正規化されているため、ランタイム警告が表示されます。次の方法以外でこれを行うより良い方法はありますか?

for i in range(N):
    for j in range(i+1,N):
        bivariate[i,j] /= bivariate[i,j].sum()

ありがとう。

4

2 に答える 2

0

の取得が心配な場合np.nanは、正規化係数の null エントリを 1 に置き換えてみてください。

 norm_factor = bivariate.sum(axis=3).sum(axis=2)[:,:,None,None]
 bivariate /= np.where(norm, norm, 1)

少なくとも、forループを回避できます...

于 2012-09-24T18:45:16.127 に答える
0

FWIW、上の三角形の部分を別々に作業してから、元に戻す方がはるかに簡単であることがわかりました.

triu = np.tri_indices(n, 1)
upper_tri = bivariate[triu].reshape(-1, Q*Q)
upper_tri /= upper_tri.sum(axis=1)
bivariate[triu] = upper_tri.reshape(-1, Q, Q)
于 2015-05-21T14:39:22.743 に答える