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 
  • Python, cPickle, Beizen Lambda-Funktionen
  • Nicht plotten 'null' in matplotlib oder null zu ändern nein [Python]
  • Wie kann man eine scipy.sparse-Matrix durch eine ausgestrahlte dichte 1d-Array elementweise multiplizieren?
  • Wie benutzt man `numpy.savez` in einer Schleife, um mehr als ein Array zu speichern?
  • Optimierung der Punkt-Kreis-Distanzmethode
  • Wie erstelle ich Zeichen-Arrays in numpy?
  • Rolling Fenster für 1D Arrays in Numpy?
  • Gibt es eine Möglichkeit, gleiche Längen-Arrays in numpy.hist zurückzugeben?
  • Wie kann man ein 2D-Numpy-Array an bestimmten Orten ohne Loop ändern?
  • SciPy statt GNU Octave
  • Die meisten effizienten Eigenschaft zu Hash für numpy Array
  • Python ist die beste Programmiersprache der Welt.