Python NumPy 连接 2 个三角形数组 above/below 对角线

Python NumPy concatenate 2 triangular arrays above/below diagonal

我正在尝试将 2 个三角形 NumPy 数组组合成 Python 中的一个新数组。每个三角形数组都用值填充了一半,对角线上为零。我需要将这 2 个数组合并为一个新的组合数组,对角线为零。

这是数组X

import numpy as np
X = np.random.rand(4,4)

[[ 0.06681579  0.25793063  0.86489791  0.78399056]
 [ 0.7335036   0.99703778  0.40017913  0.07912444]
 [ 0.43533884  0.51517525  0.28110527  0.10793738]
 [ 0.19212844  0.704657    0.94657795  0.89042305]]

然后我提取 lower 以及数组中 upper 对角线值的修改版本:

u = np.triu(X+1,k=1)
l = np.tril(X,k=-1)
print u
[[ 0.          1.25793063  1.86489791  1.78399056]
 [ 0.          0.          1.40017913  1.07912444]
 [ 0.          0.          0.          1.10793738]
 [ 0.          0.          0.          0.        ]]

print l
[[ 0.          0.          0.          0.        ]
 [ 0.7335036   0.          0.          0.        ]
 [ 0.43533884  0.51517525  0.          0.        ]
 [ 0.19212844  0.704657    0.94657795  0.        ]]

现在,我需要将这两个数组 ul 组合在一起,这样:

  1. 上三角(不包括对角线)用u
  2. 填充
  3. 下三角(不包括对角线)用l
  4. 填充
  5. 对角线仍然用零填充

这是我要找的东西:

[[ 0.          1.25793063  1.86489791  1.78399056]
 [ 0.7335036   0.          1.40017913  1.07912444]
 [ 0.43533884  0.51517525  0.          1.10793738]
 [ 0.19212844  0.704657    0.94657795  0.        ]]

有没有办法连接这 2 个 NumPy 数组以获得此输出?

u+l

大多数情况下这应该足够了。如果你需要小心保留带符号的零,你可以做一些更麻烦的事情:

result = u.copy()
l_indices = numpy.tril_indices_from(l)
result[l_indices] = l[l_indices]