2015-03-24 21 views
5

Lassen Sie uns sagen, dass wir eine n × n-Matrix haben. Unter n = 4 als Beispiel:Null aus Matrix höher diagonal mit numpy

x x x x 
x x x x 
x x x x 
x x x x 

Dies ist, was ich erreichen will:

Wenn Schnitt = 1, aus Funktionsparameter gegeben, die Matrix wird:

x x x x 
x x x x 
x x x x 
x x x 0 

Wenn Schnitt = 3:

x x x x 
x x x 0 
x x 0 0 
x 0 0 0 

wenn sie geschnitten = 5:

x x 0 0 
x 0 0 0 
0 0 0 0 
0 0 0 0 

Wie wir sehen können, ist die Diagonale wie ein Schrägstrich geschnitten wird, alles unter dem ersten Schrägstrich würde Nullen sein.

I numpy die Matrix Anlage bin mit Matrizen zu erzeugen, aber ich weiß nicht, wie solchen Algorithmus zu kodieren. Irgendwelche Hilfe bitte?

Sie können diese Matrix immer davon ausgehen, wird eine nxn Matrix und < 2n geschnitten werden - 1

+2

Werfen Sie einen Blick auf [triu] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.triu.html). Es macht etwas ähnliches, aber in einer anderen Ecke. Sie können die Matrix vor und nach 'triu' optimieren, um die richtigen Ergebnisse zu erhalten. – Mathias711

+0

Danke, @ Mathias711. Sobald ich dieses Dokument durchgelesen habe, wusste ich, dass wir die Matrix in ihre unterstützte Formation drehen und zurückdrehen können. Danke für die Hilfe von euch allen. – Luxing

Antwort

5

kann np.tri verwenden, um eine Matrix zu erzeugen, die über diejenigen unter einer gegebenen diagonalen und Nullen enthalten. Da Sie die untere rechte Ecke heraus auf Null gesetzt wollen, haben wir nach links und rechts kippen:

bottom_right = lambda N, k: np.fliplr(np.tri(N, k=k-N)) == 1 

Zum Beispiel bottom_right(4, 2) die folgende Boolesche Matrix erstellt:

array([[False, False, False, False], 
     [False, False, False, False], 
     [False, False, False, True], 
     [False, False, True, True]], dtype=bool) 

können Sie verwenden, als eine Scheibe um die Ecke Null aus:

a = np.ones((4, 4)) 
a[bottom_right(4, 2)] = 0 

a ist jetzt

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

Ein anderer Weg:

Ein Einzeiler basierend auf Mathias711's answer:

f = lambda a, k: np.fliplr(np.triu(np.fliplr(a), k=k-a.shape[0]+1)) 
+3

Guido tötet jedes Mal ein Kätzchen, wenn Sie 'Lambda' unnötigerweise verwenden, um eine Funktion zu schreiben ... – Jaime

3
a = np.array(range(16)).reshape((4,4)) 
b = np.array([list(i[::-1]) for i in a]) 
b = np.triu(b,-2) 
b = np.array([list(i[::-1]) for i in b]) 
print b 

ergibt:

array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 0]]) 

So entspricht die -2 im triu auf die 1 Sie wollen in der Frage. Stellen Sie sicher, dass die Funktionen, die dies tun, diesen Effekt korrigieren. Ich weiß, es ist nicht die pythonic Sie jemals begegnen werden, aber es funktioniert der Trick.

3

Sie folgende einfache Funktion verwenden können:

>>> def convertor(cut,array): 
...  return np.flipud(np.tri(4,4,3-cut)).__mul__(array) 

In dieser Funktion i eine Matrix erstellen haben mit der gleichen Dimension wie Ihre Matrix mit np.tri und np.flipud functions.but seine comp Basierend auf dem von Ihnen gewünschten Ergebnis werden 0 und 1 angenommen.Zum Beispiel für cut = 2 haben Sie:

>>> np.flipud(np.tri(4,4,3-2)) 
array([[ 1., 1., 1., 1.], 
     [ 1., 1., 1., 1.], 
     [ 1., 1., 1., 0.], 
     [ 1., 1., 0., 0.]]) 

alle So, jetzt es die Vermehrung dieser Matrix mit Ihren brauchen! dass wir in unserer Funktion zurückgekehrt sind!

Demo:

>>> m=array([[ 4., 4., 4., 4.], 
...   [ 4., 4., 4., 4.], 
...   [ 4., 4., 4., 4.], 
...   [ 4., 4., 4., 4.]]) 
>>> convertor(3,m) 
array([[ 4., 4., 4., 4.], 
     [ 4., 4., 4., 0.], 
     [ 4., 4., 0., 0.], 
     [ 4., 0., 0., 0.]]) 
>>> convertor(0,m) 
array([[ 4., 4., 4., 4.], 
     [ 4., 4., 4., 4.], 
     [ 4., 4., 4., 4.], 
     [ 4., 4., 4., 4.]]) 
>>> convertor(1,m) 
array([[ 4., 4., 4., 4.], 
     [ 4., 4., 4., 4.], 
     [ 4., 4., 4., 4.], 
     [ 4., 4., 4., 0.]]) 
>>> convertor(5,m) 
array([[ 4., 4., 0., 0.], 
     [ 4., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]])