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,可以尝试将归一化因子的空条目替换为 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 回答