Seite 1 von 1
Wie wandle ich numpy array in ein sympy array um?
Verfasst: Donnerstag 25. August 2016, 17:07
von Brando
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?
Re: Wie wandle ich numpy array in ein sympy array um?
Verfasst: Donnerstag 25. August 2016, 17:30
von Sirius3
@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)
Re: Wie wandle ich numpy array in ein sympy array um?
Verfasst: Donnerstag 25. August 2016, 17:30
von BlackJack
@Brando: Wieviel ”Forschung” hast Du denn bitte in die Beantwortung dieser Frage gesteckt? Was hast Du gemacht und was funktionierte daran nicht?
Re: Wie wandle ich numpy array in ein sympy array um?
Verfasst: Donnerstag 25. August 2016, 17:45
von Brando
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.
Re: Wie wandle ich numpy array in ein sympy array um?
Verfasst: Donnerstag 25. August 2016, 17:52
von Brando
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)
Re: Wie wandle ich numpy array in ein sympy array um?
Verfasst: Donnerstag 25. August 2016, 18:25
von 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.
Re: Wie wandle ich numpy array in ein sympy array um?
Verfasst: Donnerstag 25. August 2016, 18:41
von Brando
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?
Re: Wie wandle ich numpy array in ein sympy array um?
Verfasst: Donnerstag 25. August 2016, 18:50
von 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]]))
Re: Wie wandle ich numpy array in ein sympy array um?
Verfasst: Donnerstag 25. August 2016, 19:08
von Brando
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
Re: Wie wandle ich numpy array in ein sympy array um?
Verfasst: Donnerstag 25. August 2016, 20:03
von Sirius3
@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))
Re: Wie wandle ich numpy array in ein sympy array um?
Verfasst: Donnerstag 25. August 2016, 20:32
von 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.
Re: Wie wandle ich numpy array in ein sympy array um?
Verfasst: Freitag 26. August 2016, 10:50
von Brando
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))