2016-04-06 33 views
1

Ich möchte eine Toeplitz-Matrix von Toeplitz-Matrix erstellen. H1, H2 und H3 sind bereits Toeplitz-Matrizen. Mein Ergebnis sollte so aussehen: H1 0 0 H2 H1 0 H3 H2 H1 0 H3 H2 0 0 H3Toeplitz-Matrix von Toeplitz-Matrix

Die vorhandene toeplitz-Funktion akzeptiert nur Vektor, also kann ich es nicht für Matrix verwenden. Derzeit verwende ich vstack, um die erste Spalte, dann die zweite Spalte usw. zu erstellen, und dann verwende ich hstack, um alle Spalten zusammenzuführen. Dies ist sehr aufwendig, da ich an bestimmten Stellen gezielt np.zeros Matrizen hinzufügen muss. Ich kann mir keinen besseren Weg vorstellen, um numpige Arrays zu verketten, da es nur wenige Funktionen dafür gibt und keines wirklich zu meinem Problem passt.

+0

Könnten Sie zeigen Sie Ihre vorhandenen Code ? Es würde helfen, weil es zeigen würde, welches Ergebnis Sie erreichen möchten und was Sie nicht an dem Ergebnis mögen, das Sie bekommen. – roadrunner66

+0

Es gibt nichts besonderes an meinem Code. Ich habe nur eine Schleife, die vstack verwendet, um meine Liste der np.arrays (H1, H2, H3) zu stapeln. Dann muss ich mein np.zero-Array mit der gleichen Form wie eines der H manuell vstack, um meine erste Spalte zu erstellen. Dann muss ich für die zweite Spalte manuell EMPTY H1 H2 H3 EMPTY vestack und für die dritte Spalte gleich. Am Ende verwende ich eine Schleife, um alle meine erstellten Spalten zu stacken. Das Problem ist der ganze Stapel-Teil, den ich nicht dynamisch machen kann. Mein endgültiger Toeplitz der Toeplitz-Matrix besteht aus 25 Differenzen Hs und die Anzahl der EMPTY-Arrays wird 200+ für jede Spalte betragen. – pythonFriend

Antwort

1

Anstelle der verschachtelten Aufrufe von vstack und hstack ist es effizienter, das endgültige Array vorab zuzuweisen und dann eine verschachtelte Schleife zum Ausfüllen des Arrays zu verwenden. Sie können zunächst ein Array höherer Ordnung verwenden, um den Code sauber zu halten.

Zum Beispiel dieses Skript

import numpy as np 

H1 = np.array([[11, 11], [11, 11]]) 
H2 = np.array([[22, 22], [22, 22]]) 
H3 = np.array([[33, 33], [33, 33]]) 

inputs = (H1, H2, H3) 

# This assumes all the arrays in `inputs` have the same shape, 
# and that the data type of all the arrays is the same as H1.dtype. 
nh = len(inputs) 
nrows = 2*nh - 1 
m, n = H1.shape 
# T is a 4D array. For a given i and j, T[i, :, j, :] is a 2D array 
# with shape (m, n). T can be intepreted as a 2D array of 2D arrays. 
T = np.zeros((nrows, m, nh, n), dtype=H1.dtype) 
for i, H in enumerate(inputs): 
    for j in range(nh): 
     T[i + j, :, j, :] = H 

# Partially flatten the 4D array to a 2D array that has the desired 
# block structure. 
T.shape = (nrows*m, nh*n) 

print(T) 

druckt

[[11 11 0 0 0 0] 
[11 11 0 0 0 0] 
[22 22 11 11 0 0] 
[22 22 11 11 0 0] 
[33 33 22 22 11 11] 
[33 33 22 22 11 11] 
[ 0 0 33 33 22 22] 
[ 0 0 33 33 22 22] 
[ 0 0 0 0 33 33] 
[ 0 0 0 0 33 33]] 

(Beachten Sie, dass das Ergebnis nicht eine Toeplitz-Matrix ist, es ist ein block Toeplitz matrix ist.)

+0

Das ist eigentlich, was ich wollte, aber ich habe Mühe, Parameter zu verstehen, der die endgültige Block-Toeplitz-Dimension bestimmt. Am Ende sollte es 256 * 256 Dimensionen haben. Aber wenn ich nh oder nrows ändere, bekomme ich Fehler außerhalb der Grenzen. – pythonFriend

+0

* "... wenn ich nh oder nrows ändere, bekomme ich Fehler außerhalb der Grenzen." * 'Nh' und' nrows' werden durch die Anzahl der Eingabe-Arrays bestimmt. Wie Sie im Code sehen können, ist 'nh' einfach' len (Eingaben) '(d. H. Die Anzahl der Eingabearrays), und' nrows' ist '2 * nh - 1'. In dem Code, den ich geschrieben habe, können Sie diese nicht unabhängig voneinander ändern. Die Implementierung basiert auf meiner Interpretation der Frage. Wenn Sie etwas flexibleres benötigen, bearbeiten Sie die Frage und erklären Sie. –