Wie wandle ich numpy array in ein sympy array um?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Hallo,

gerne würde ich eine Matrix in latex Schreibweise darstellen. Das funktioniert für sympy Arrays recht gut. Aber ich habe numpy Arrays. Wie gehe ich vor?
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Brando: indem Du halt die Ausgabe der Matrix so hinformatierst, wie Du es brauchst

Code: Alles auswählen

    latex = '\\left[\\begin{matrix}%s\\end{matrix}\\right]' % ' \\\\ '.join(' & '.join(map(str,r)) for r in matrix)
BlackJack

@Brando: Wieviel ”Forschung” hast Du denn bitte in die Beantwortung dieser Frage gesteckt? Was hast Du gemacht und was funktionierte daran nicht?
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Also die Matrizen habe ich wie folgt gewonnen:

Code: Alles auswählen

a_matrix=zeros(matrix.shape[0], matrix.shape[1])
  
  for i in range(matrix.shape[0]):
    for j in range(matrix.shape[1]):
      a_matrix[i,j]=randint(-10,10)
Dann habe ich folgendes ausprobiert:

Code: Alles auswählen

   q,r = np.linalg.qr(a_matrix)
   q_m=Matrix(q)
   r_m=Matrix(r)
   q_matrix=latex(q_m)
   q_matrix=q_matrix.replace("left[", "left(")
   q_matrix=q_matrix.replace("right]", "right)")
   r_matrix=latex(r_m)
   r_matrix=r_matrix.replace("left[", "left(")
   r_matrix=r_matrix.replace("right]", "right)")
   str="$\langle"+q_matrix+","+r_matrix+ "\\rangle$"
   matrizen_latex=widgets.Latex()
   matrizen_latex.value= q_matrix
   display(matrizen_latex)
Ich erhalte eine Ausgabe ohne eine Latexformatierung der Matrizen. Wenn ich q,r in sympy Matrizen umformen könnte glaube ich würde es funktionieren.
Zuletzt geändert von Anonymous am Donnerstag 25. August 2016, 18:27, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Folgender Code führt auf einen MathProcessing Error

Code: Alles auswählen

   q,r = np.linalg.qr(a_matrix)
   latex_q = '\\left[\\begin{matrix}%s\\end{matrix}\\right]' % ' \\\\ '.join(' & '.join(map(str,r)) for r in q)
   
   matrizen_latex=widgets.Latex()
   matrizen_latex.value= latex_q
   display(matrizen_latex)
BlackJack

@Brando: Wie man eine Matrix mit Zufallswerten erstellt wurde Dir soweit ich mich erinnere schon mindestens zweimal gezeigt. Warum machst Du das immer noch so verdammt umständlich?

Code: Alles auswählen

In [37]: np.random.randint(-10, 10, (3, 3))
Out[37]: 
array([[-4, -1,  6],
       [ 8, -1, -2],
       [-3,  1,  4]])
Wie man eine Numpy-Matrix oder ein Numpy-Array in ein `sympy.Matrix`-Objekt umwandelt weisst Du ja anscheinend, das ist also nicht das Problem. Also wenn man jetzt mal davon ausgeht das `Matrix` an den Wert von `sympy.Matrix` gebunden ist. Also ist Deine Problembeschreibung falsch, denn bis dahin funktioniert es ja. Also musst Du heraus finden warum die weiteren Schritte nicht mehr funktionieren. Schau Dir die Zwischenergebnisse an. Was erwartest Du jeweils und was kommt tatsächlich dabei heraus.

Bei dem `MathProcessingError` (?) wäre ein Traceback ganz nett.

Wir haben hier auch nicht zum ersten mal das Problem, dass man das nicht einfach mal nachvollziehen kann, weil da Teile fehlen, inklusive einer Beschreibung wie man das letztendlich ausführen soll. Denn das ist ja offenbar immer noch etwas das irgendwie im Kontext eines Jupyter-Notebooks laufen soll/muss.
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Das Problem ist glaube ich, dass die QR Zerlegung eine Darstellung mit symbolischer Mathematik liefert. Wie kann ich eine Darstellung erreichen, in der nur float Zahlenwerte vorkommen?
BlackJack

@Brando: Nicht glauben; wissen. Diese Vermutung zu überprüfen ist ja nun nicht sooo schwer:

Code: Alles auswählen

In [39]: a_matrix
Out[39]: 
array([[-4, -1,  6],
       [ 8, -1, -2],
       [-3,  1,  4]])

In [40]: np.linalg.qr(a_matrix)
Out[40]: 
(array([[-0.42399915, -0.83996775,  0.33864273],
        [ 0.8479983 , -0.23691398,  0.47409982],
        [-0.31799936,  0.48818638,  0.81274255]]),
 array([[ 9.43398113, -0.74199852, -5.51198898],
        [ 0.        ,  1.56506811, -2.613233  ],
        [ 0.        ,  0.        ,  4.33462695]]))
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Nun gut; eine solche Darstellung versuche ich mit folgendem Code um eine aus numpy in sympy umgewandelte Formel als Matrize darzustellen. Es gibt aber wieder eine Fehlermeldung:

Code: Alles auswählen

   q,r = np.linalg.qr(a_matrix)
   
   q_mat=Matrix(q)
   
   q_matrix=latex(q_mat)
   q_matrix=q_matrix.replace("left[", "left(")
   q_matrix=q_matrix.replace("right]", "right)")
   
   matrizen_latex=widgets.Latex()
   matrizen_latex.value= q_matrix
   display(matrizen_latex)
   
die folgende Fehlermeldung:

MathProcessingError
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Brando: Du willst LaTeX verwenden, ohne LaTeX zu lernen und Du willst Python verwenden, ohne Python zu lernen. Wie lange glaubst Du, ziehen wir Dich hier noch durch?

Vielleicht sollte man LaTeX sagen, dass man eine Formel haben will. Und wenn Du lieber runde Klammern willst, dann nimm halt gleich welche:

Code: Alles auswählen

latex = '\\left(\\begin{matrix}%s\\end{matrix}\\right)' % ' \\\\ '.join(' & '.join(map(str,r)) for r in matrix)
display(widgets.Latex(value='$$%s$$' % latex))   
BlackJack

Und wenn man das mit `sympy.Matrix` lösen möchte, dann sollte man auch dort sagen das runde statt eckige Klammern verwendet werden sollen, statt das hinterher auf dem LaTeX-Quelltext zu ersetzen. `sympy` bietet da viele Möglichkeiten die LaTeX-Erzeugung zu beeinflussen. Das hatte ich aber auch schon mal in einem Beitrag in einem Deiner Themen geschrieben. Die `sympy`-Dokumentation hat wirklich viele Beispiele für die ganzen Optionen. Man muss das halt mal durcharbeiten.
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Sirius: das Problem ist, dass dein Code nur einen mathProcessingError hervorruft und nicht funktioniert. Ich habe ihn wie folgt adaptiert:

Code: Alles auswählen

   q,r = np.linalg.qr(a_matrix)
   latex = '\\left(\\begin{matrix}%s\\end{matrix}\\right)' % ' \\\\ '.join(' & '.join(map(str,r)) for r in q)
   display(widgets.Latex(value='$$%s$$' % latex))   
Antworten