2016-12-06 2 views
0

Ich versuche, 2 dreieckige NumPy-Arrays in ein neues Array in Python zu kombinieren. Jedes dreieckige Array ist zur Hälfte mit Werten gefüllt, mit Nullen auf der Diagonalen. Ich muss diese 2 Arrays in ein neues kombiniertes Array mit Nullen auf der Diagonale zusammenführen. HierPython NumPy verketten 2 dreieckige Arrays über/unter Diagonale

ist das Array 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]] 

ich dann extrahieren Sie die lower und eine modifizierte Version der upper diagonalen Werte aus dem Array:

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.  ]] 

Nun, ich brauche diese 2 zu kombinieren Arrays u und l zusammen, so dass:

  1. das obere Dreieck (nicht diagonal einschließlich) mit u
  2. das unteren Dreieck (ohne diagonal) mit l
  3. diagonalen noch gefüllt mit Nullen

Hier gefüllt ist gefüllt ist, was ich Bin auf der Suche nach:

Gibt es eine Möglichkeit, diese 2 NumPy Arrays zu verketten, um diese Ausgabe zu bekommen?

+1

ul = np.where (u == 0, l, u) vielleicht – NaN

+0

Ok, ich die Antwort unten als akzeptiert markiert . Diese Methode ist jedoch sehr präzise und funktioniert auch. Ich habe 'u [u == 0] = l' ausprobiert, aber das hat nicht funktioniert. Gute Antwort. Danke @NaN. –

+0

Es ist nützlich ... a = np.zeros ((4,4), dtype = int) ... b = np.bereich (16) .reshape (4,4) ... u = np.triu (a + 1, k = 1) ... versuch ... np.wobei (u == 0, b, a) ... oder ... np.wobei (u == 0, a + 5, b) ... ermöglicht Verknüpfungen zu mehreren Array-Konstruktionsalternativen. Plus können Sie verwenden ... ur = np.rot90 (u) ... wenn die Ausrichtung von Triu oder Trial nicht – NaN

Antwort

4
u+l 

Das sollte für die meisten Fälle ausreichen. Wenn Sie sich über die Erhaltung unterzeichnet Nullen vorsichtig sein müssen, können Sie etwas umständlicher tun:

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

Danke. Ich habe versucht, Werte direkt zu nehmen, ohne Indizes zu verwenden. Das hat nicht funktioniert. Das funktioniert großartig! –