diese Hier ist ein weiterer guter Weg, zu tun.. Wenn Sie eine eindimensionale Sicht auf die Hauptdiagonale Verwendung des Arrays:
A.ravel()[:A.shape[1]**2:A.shape[1]+1]
Für die i-te superdiagonal Verwendung:
A.ravel()[i:max(0,A.shape[1]-i)*A.shape[1]:A.shape[1]+1]
Für die i-te subdiagonal Verwendung:
A.ravel()[A.shape[1]*i:A.shape[1]*(i+A.shape[1]):A.shape[1]+1]
Oder im Allgemeinen, für die i-Diagonale, wo die Hauptdiagonale 0 ist, sind die Subdiagonalen negativ und die Superdiagonalen sind positiv, verwenden:
Dies sind Ansichten und keine Kopien, so dass sie zum Extrahieren einer Diagonale schneller ausgeführt werden, aber alle Änderungen am neuen Array-Objekt werden auf das ursprüngliche Array angewendet. Auf meinem Computer laufen diese schneller als die Funktion fill_diagonal, wenn die Hauptdiagonale auf eine Konstante gesetzt wird, aber das ist möglicherweise nicht immer der Fall. Sie können auch verwendet werden, um einer Diagonalen anstelle einer Konstante ein Wertefeld zuzuordnen.
Hinweise: Bei kleinen Arrays kann das Attribut flat
des NumPy-Arrays möglicherweise schneller verwendet werden. Wenn Geschwindigkeit ein großes Problem ist, könnte es sich lohnen, A.shape[1]
eine lokale Variable zu machen. Wenn das Array nicht zusammenhängend ist, wird auch ravel()
eine Kopie zurückgeben. Um einem schrittweisen Segment Werte zuzuweisen, muss das ursprüngliche Array, das zum Generieren des schrittweisen Segments verwendet wurde, kreativ geschnitten werden (wenn es zusammenhängend ist). oder um das flat
Attribut zu verwenden.
Auch war ursprünglich geplant, dass in NumPy 1.10 und später die 'Diagonale' Methode von Arrays eine Ansicht statt einer Kopie zurückgeben wird. Diese Änderung wurde noch nicht gemacht, aber hoffentlich wird dieser Trick an einer Stelle nicht mehr nötig sein. Siehe http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.diagonal.html
Welche Version von numpy verwenden Sie? 'np.diag_indices_from' wurde in v1.4 hinzugefügt – JoshAdel
yep, du hast recht, ich benutze derzeit python v 1.3.0 – pacodelumberg
@LangerHansIslands Hoffentlich meinst du numpy 1.3, nicht Python 1.3 (die Mitte der neunziger Jahre herauskam .. .: p) – Dougal