2016-12-06 123 views
0

我想在Python中将2个三角形NumPy数组组合成一个新数组。每个三角形阵列都是半值填充的,在对角线上为零。我需要将这两个数组合并成一个新的组合数组,其对角线上的零点。Python 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]] 

我然后提取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.  ]] 

现在,我需要将这些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.  ]] 

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

+1

UL = np.where(U == 0,L,U)也许 – NaN

+0

好吧,我在下面标记为接受的答案。但是,这种方法非常简洁,也适用。我试过'u [u == 0] = l',但那不起作用。很好的答案。谢谢@NaN。 –

+0

它是有用的... a = np.zeros((4,4),dtype = int)... b = np.arange(16).reshape(4,4)... u = np.triu (u == 0,a + 5,b)a, ...启用几个阵列构建方法的捷径。另外,您可以使用... ur = np.rot90(u)...如果triu或trial的方向不适合 – NaN

回答

4
u+l 

这应该足以满足大多数情况。如果你需要小心维护符号的零,你可以做一些事情更麻烦:

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

谢谢。我试图直接采用值,而不使用索引。这没有用。这很好用! –