1D-Numpy-Array, das für jede aufeinanderfolgende Zeile in einem neuen 2D-Array nach rechts verschoben wird

Ich versuche, einen Code zu optimieren, indem ich für Loops und mit numpy Arrays nur, wenn ich mit großen Datensätzen arbeiten.

Ich möchte gerne ein 1D numpy Array, zum Beispiel:

a = [1, 2, 3, 4, 5] 

Und produzieren eine 2D numpy Array, wobei der Wert in jeder Spalte verschiebt sich entlang einer Stelle, zum Beispiel im obigen Fall für eine Ich möchte eine Funktion, die zurückgibt:

 [[1 2 3 4 5] [0 1 2 3 4] [0 0 1 2 3] [0 0 0 1 2] [0 0 0 0 1]] 

Ich habe Beispiele gefunden, die die Bewegungsfunktion verwenden, um etwas Ähnliches zu produzieren, zum Beispiel zu produzieren:

 [[1 2 3] [2 3 4] [3 4 5]] 

Allerdings versuche ich, jede meiner Spalten in die andere Richtung zu verschieben. Alternativ kann man das Problem sehen, indem man das erste Element von a auf die erste Diagonale, das zweite Element auf der zweiten Diagonale und so weiter setzt. Allerdings möchte ich noch einmal betonen, wie ich es vermeiden möchte, eine für, während oder wenn Schleife ganz zu verwenden. Jede Hilfe wäre sehr dankbar.

2 Solutions collect form web for “1D-Numpy-Array, das für jede aufeinanderfolgende Zeile in einem neuen 2D-Array nach rechts verschoben wird”

Eine solche Matrix ist ein Beispiel für eine Toeplitz-Matrix . Du scipy.linalg.toeplitz benutzen, um es zu schaffen:

 In [32]: from scipy.linalg import toeplitz In [33]: a = range(1,6) In [34]: toeplitz(a, np.zeros_like(a)).T Out[34]: array([[1, 2, 3, 4, 5], [0, 1, 2, 3, 4], [0, 0, 1, 2, 3], [0, 0, 0, 1, 2], [0, 0, 0, 0, 1]]) 

Inspiriert von @ EelcoHoogendoorn Antwort, hier ist eine Variation, die nicht so viel Speicher wie scipy.linalg.toeplitz :

 In [47]: from numpy.lib.stride_tricks import as_strided In [48]: a Out[48]: array([1, 2, 3, 4, 5]) In [49]: t = as_strided(np.r_[a[::-1], np.zeros_like(a)], shape=(a.size,a.size), strides=(a.itemsize, a.itemsize))[:,::-1] In [50]: t Out[50]: array([[1, 2, 3, 4, 5], [0, 1, 2, 3, 4], [0, 0, 1, 2, 3], [0, 0, 0, 1, 2], [0, 0, 0, 0, 1]]) 

Das Ergebnis sollte als "read only" Array behandelt werden. Andernfalls wirst du für einige Überraschungen sein, wenn du ein Element änderst. Beispielsweise:

 In [51]: t[0,2] = 99 In [52]: t Out[52]: array([[ 1, 2, 99, 4, 5], [ 0, 1, 2, 99, 4], [ 0, 0, 1, 2, 99], [ 0, 0, 0, 1, 2], [ 0, 0, 0, 0, 1]]) 

Hier ist die indexierungs-tricks-basierte lösung. Nicht annähernd so elegant wie die toeplitz-Lösung bereits gepostet, aber sollte Speicherverbrauch oder Leistung ein Anliegen sein, ist es zu bevorzugen. Wie dies gezeigt wird, ist es auch leicht, die Einträge der Matrix nachträglich manipulieren zu können.

 import numpy as np a = np.arange(5)+1 def toeplitz_view(a): b = np.concatenate((np.zeros_like(a),a)) i = a.itemsize v = np.lib.index_tricks.as_strided(b, shape=(len(b),)*2, strides=(-i, i)) #return a view on the 'original' data as well, for manipulation return v[:len(a), len(a):], b[len(a):] v, a = toeplitz_view(a) print v a[0] = 10 v[2,1] = -1 print v 
  • Finde die meisten entfernten Punkte in der Konturkurve
  • Warum ist "NaN" als "kleiner" als `-np.inf` in numpy?
  • Liefern ein Array voll mit Objekten als Argument einer anderen Klasse und erhalten die korrigierten zurück
  • Finden Sie einzigartige Zeilen in numpy.array
  • Kann ich ein numpy Array als 16-Bit-Bild mit "normal" (Enthought) python speichern?
  • Suche nach einem Sub-Array innerhalb eines 2D-Arrays (Bilderkennung)
  • Python Numpy oder Pandas Lineare Interpolation Für datetimebezogene Werte
  • Numpy error: Singuläre Matrix
  • Indexierung / Slicing in numpy Array, um es zu ändern
  • Wie konvertiert man ein Numpy 2D Array mit Objekt dtype zu einem regulären 2D Array von floats
  • Wie wähle man den Wert aus dem Array aus, das dem Wert im Array mit der Vektorisierung am nächsten liegt?
  • Python ist die beste Programmiersprache der Welt.