我有一个尺寸为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()
感谢。
答案 0 :(得分:0)
如果您担心获得np.nan
,可以尝试将规范化因子的空条目替换为1:
norm_factor = bivariate.sum(axis=3).sum(axis=2)[:,:,None,None]
bivariate /= np.where(norm, norm, 1)
至少你会避免for
循环......
答案 1 :(得分: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)