Konstruieren einer speziellen Matrix in numpy dynamisch

Also mein Ziel ist das folgende, angesichts der Größe der Matrix s , ich versuche, eine Matrix zu erstellen, die wie folgt aussieht, aber für Größe sxs :

 [1 1 0] [1 1 1] [0 1 1] 

Für die Größe von 4×4, würde es so aussehen wie die folgenden:

 [1 1 0 0] [1 1 1 0] [0 1 1 1] [0 0 1 1] 

Sie können also ein Muster beobachten: Es gibt s-1 Anzahl von überlappenden Mini- 2x2 Matrizen.

Ich dachte an die Schaffung einer 2x2 Matrix und dann mit einer dynamischen Referenzierung (für Schleife?) Wie B[:-1,:-1] = ones_matrix , wobei B die sxs der Größe sxs . Aber ich bin mir nicht sicher, wie man hier eine Schleife einbringt, denn wenn wir eine 4x4 Matrix sagen, dann müssten wir B auf drei Arten wie B[:-1,:-1] = ones_matrix, B[1:-1,1:-1] = ones_matrix, B[2:,2:]=ones_matrix : B[:-1,:-1] = ones_matrix, B[1:-1,1:-1] = ones_matrix, B[2:,2:]=ones_matrix . Und ich kann nicht herausfinden, einen Weg, um das dynamisch für n sized Nullen Matrix zu tun. Gibt es vielleicht einen anderen Weg, dies zu tun?

3 Solutions collect form web for “Konstruieren einer speziellen Matrix in numpy dynamisch”

Methode # 1: Statt einer Reihe von 2×2 Matrizen, könnte es einfacher sein, es als drei Diagonalen von 1 zu betrachten und diese zu kombinieren:

 >>> s = 3 >>> np.diag([1]*s,0) + np.diag([1]*(s-1),-1) + np.diag([1]*(s-1), 1) array([[1, 1, 0], [1, 1, 1], [0, 1, 1]]) >>> s = 4 >>> np.diag([1]*s,0) + np.diag([1]*(s-1),-1) + np.diag([1]*(s-1), 1) array([[1, 1, 0, 0], [1, 1, 1, 0], [0, 1, 1, 1], [0, 0, 1, 1]]) 

Methode # 2: (von der Antwort von Divankar inspiriert) können wir in der Entfernung von der Mitte denken:

 >>> s = 4 >>> i,j = np.indices((s,s)) >>> (abs(ij) <= 1).astype(int) array([[1, 1, 0, 0], [1, 1, 1, 0], [0, 1, 1, 1], [0, 0, 1, 1]]) 

Methode # 3: Wir könnten die Vorteile von tril oder triu und einige Arithmetik:

 >>> m = np.tril(np.ones((s,s)),1) >>> m * mT array([[ 1., 1., 0., 0., 0.], [ 1., 1., 1., 0., 0.], [ 0., 1., 1., 1., 0.], [ 0., 0., 1., 1., 1.], [ 0., 0., 0., 1., 1.]]) >>> m = np.tril(np.ones((s,s)),2) >>> m * mT array([[ 1., 1., 1., 0., 0.], [ 1., 1., 1., 1., 0.], [ 1., 1., 1., 1., 1.], [ 0., 1., 1., 1., 1.], [ 0., 0., 1., 1., 1.]]) 

Du könntest auch sympy.Matrix verwenden:

 from sympy import Matrix Matrix(4, 4, lambda i,j: 1 if (-2<ij<2) else 0) Matrix([ [1, 1, 0, 0], [1, 1, 1, 0], [0, 1, 1, 1], [0, 0, 1, 1]]) 

Vektorisierter Ansatz mit broadcasting

 A = np.arange(s) out = ((A[:,None] < A+2) & (A[:,None] > A-2)).astype(int) 

Beispiellauf –

 In [60]: s = 3 ...: A = np.arange(s) ...: out = ((A[:,None] < A+2) & (A[:,None] > A-2)).astype(int) ...: In [61]: out Out[61]: array([[1, 1, 0], [1, 1, 1], [0, 1, 1]]) In [62]: s = 4 ...: A = np.arange(s) ...: out = ((A[:,None] < A+2) & (A[:,None] > A-2)).astype(int) ...: In [63]: out Out[63]: array([[1, 1, 0, 0], [1, 1, 1, 0], [0, 1, 1, 1], [0, 0, 1, 1]]) 
  • Finde die meisten entfernten Punkte in der Konturkurve
  • Pandas: Unterschied zwischen dem größten und kleinsten Wert innerhalb der Gruppe
  • Eine effiziente Möglichkeit, den Mittelwert jeder Spalte oder Zeile von Nicht-Null-Elementen zu berechnen
  • SciPy Optimierung: Matrix Operations
  • Python-Pandas-Rolling-Funktion mit zwei Argumenten
  • Filtern einer Liste basierend auf einer Liste von Booleschen
  • Zuordnen von Spaltennamen zu einem csv-Dataset
  • Umwandlung von numpy dtypes zu nativen Python-Typen
  • Holen Sie sich Informationen aus Unterlisten in der Hauptliste elegant
  • Plotten eines Zeitalters-Graphen in Python mit Matplotlib aus einer CSV-Datei
  • Numpy: äußeres Produkt von n Vektoren
  • Python ist die beste Programmiersprache der Welt.