Python NumPy 连接对角线上方/下方的 2 个三角形数组

ede*_*esz 0 python arrays numpy concatenation diagonal

我试图在 Python 中将 2 个三角形 NumPy 数组组合成一个新数组。每个三角形数组都填充了一半的值,对角线上的值为零。我需要将这 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]]
Run Code Online (Sandbox Code Playgroud)

然后我从数组中提取对角线值的较低 和修改版本:

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.        ]]
Run Code Online (Sandbox Code Playgroud)

现在,我需要这2个阵列组合ul在一起,这样:

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

这是我要找的:

[[ 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.        ]]
Run Code Online (Sandbox Code Playgroud)

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

use*_*ica 5

u+l
Run Code Online (Sandbox Code Playgroud)

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

result = u.copy()
l_indices = numpy.tril_indices_from(l)
result[l_indices] = l[l_indices]
Run Code Online (Sandbox Code Playgroud)