2016-03-27 7 views
4

Ich möchte eine Python-Funktion schreiben, die eine Nullmatrix der Größe n durch n erzeugt, die 1 für alle Elemente oberhalb der Hauptdiagonalen hat.Python-Code zum Erzeugen einer Diagonalmatrix mit 1 über der Hauptdiagonalen

Hier ist mein Code:

def funtest(n): 
    for i in range(0,n-2): 
     s = (n,n) 
     Y = zeros(s) 
     Z = Y 
     Z[i,i+1]=1   
return Z 

Aber das Ergebnis nur 1 gibt in den (n-1, n-2) Element der Matrix.

Ich bin fest und ich denke wirklich, dass mein Code korrekt ist und keine Ahnung, wo der Fehler ist. Und wie kann ich es reparieren? Kann mir bitte jemand helfen?

Danke.

+1

Du Zurücksetzen der Matrix auf Null bei jeder Iteration der Schleife – mfitzp

Antwort

2

Sie setzen Ihre Matrix bei jeder Iteration auf Null zurück. Bewegen Sie den zeros Anruf außerhalb der Schleife, und es funktioniert gut:

def funtest(n): 
    s = (n,n) 
    Y = zeros(s) 
    for i in range(0,n-1): 
     Y[i,i+1]=1   
    return Y 

Beachten Sie, dass Sie auch in einer Schleife müssen n-1, nicht n-2 (nach oben bewegt eine Zeile nur die Anzahl der 1s um 1 reduziert!). Hier ist die Ausgabe der festen Funktion oben:

funtest(5) 

array([[ 0., 1., 0., 0., 0.], 
     [ 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 1., 0.], 
     [ 0., 0., 0., 0., 1.], 
     [ 0., 0., 0., 0., 0.]]) 

Diese Ihre Methode passt, sondern auch the answer from Swier mit numpy builtin np.diag(np.ones(n-1),1) sehen.

+0

Dank @mfitzp. Aber eine Sache verstehe ich nicht über die Grenze der Schleife. Stimmt es, dass A [1,3] das Element in der (2,4) Position von Matrix A gibt? Also sollte 1 Reihe vor der n-ten Reihe (n-2) -te Reihe sein? – user71346

+0

Das stimmt, aber die Bereichsschleife wiederholt einfach die Anzahl der benötigten 1s. Der Offset ist bereits durch Y [i, i + 1] bestimmt. Bewegt man ein Element nach oben (oder "über"), so verringert sich die Anzahl der Einsen um 1. Der Bereich (0,5) erzeugt 0,1,2,3,4 (Nr. 5), also für den Bereich n = 5 (0, n-1) gibt 0,1,2,3 – mfitzp

+0

Oh ja, ja. Vielen Dank. – user71346

8

numpy.diag Die Funktion kann nicht genau das:

import numpy as np 
print(np.diag(np.ones(4), 1)) 

Mit dem zweiten Argument (die 1) den Offset für den Diagonalen. Es gibt:

array([[ 0., 1., 0., 0., 0.], 
     [ 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 1., 0.], 
     [ 0., 0., 0., 0., 1.], 
     [ 0., 0., 0., 0., 0.]]) 
+1

So kleine Kompensation;) – jezrael

3

Wollen Sie nur auf einer Diagonale oder für das gesamte obere Dreieck?

Es gibt eine Reihe von np.tri* Funktionen Index und erstellen obere und untere Dreieck-Arrays:

In [395]: np.triu(np.ones((5,5),int),1) 
Out[395]: 
array([[0, 1, 1, 1, 1], 
     [0, 0, 1, 1, 1], 
     [0, 0, 0, 1, 1], 
     [0, 0, 0, 0, 1], 
     [0, 0, 0, 0, 0]]) 

Ich konnte sogar eine Diagonale mit zwei tri Anrufe

In [399]: np.tril(np.triu(np.ones((5,5),int),1),1) 
Out[399]: 
array([[0, 1, 0, 0, 0], 
     [0, 0, 1, 0, 0], 
     [0, 0, 0, 1, 0], 
     [0, 0, 0, 0, 1], 
     [0, 0, 0, 0, 0]]) 

nicht schaffen, dass ich empfehlen würde dies über die np.diag Funktion. :)

oder

In [404]: np.diagflat(np.ones(4,int),1) 
Out[404]: 
array([[0, 1, 0, 0, 0], 
     [0, 0, 1, 0, 0], 
     [0, 0, 0, 1, 0], 
     [0, 0, 0, 0, 1], 
     [0, 0, 0, 0, 0]]) 
Verwandte Themen