String in ndarray für numpy wandeln

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
nieselfriem
User
Beiträge: 60
Registriert: Sonntag 13. Januar 2013, 16:00

String in ndarray für numpy wandeln

Beitragvon nieselfriem » Freitag 10. Februar 2017, 20:36

Hallo,

ich möchte ein wenig in QT und numpy was ausprobieren. Dabei habe ich ein QLineEdit in dem eine Funktion stehen soll, z.B. "x**2" und diese soll dann mit matplotlib und numpy als Graph ausgegeben werden. Doch leider scheitert das Thema an dem datentypen für numpy

ich kann für numpy eine Funktion ja wie folgt angeben

  1. y = 0.5*x*2-9  


Nun liefert aber QLineEdit diese Funktion als String. Wie kann ich diesen String als Datentyp für numpy konvertieren?

vg niesel
Benutzeravatar
MagBen
User
Beiträge: 682
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Re: String in ndarray für numpy wandeln

Beitragvon MagBen » Samstag 11. Februar 2017, 09:04

Schau Dir das mal an
  1. from PyQt4.QtCore import QString
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4.  
  5. lineEditOutput = QString("0.5*x*2-9")
  6. my_function_str = unicode(lineEditOutput)
  7. my_function = eval("lambda x: " + my_function_str)
  8. x = np.linspace(0,5,21)
  9. y = my_function(x)
  10.  
  11. plt.figure()
  12. plt.plot(x,y)
  13. plt.show()
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
snafu
User
Beiträge: 5028
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Re: String in ndarray für numpy wandeln

Beitragvon snafu » Samstag 11. Februar 2017, 09:44

Hier ist das umfangreiche SymPy-Package ein gutes Bindeglied:
  1. import numpy as np
  2. from sympy.abc import x, y
  3. from sympy.parsing.sympy_parser import parse_expr
  4. from sympy.utilities.lambdify import lambdify
  5.  
  6. def make_func(string, symbols=(x,)):
  7.     return lambdify(symbols, parse_expr(string))
  8.  
  9. def main():
  10.     xs = np.linspace(0, 1, 5)
  11.     double = make_func('x*2')
  12.     print('Original:', xs)
  13.     print('Double:', double(xs))
  14.     print()
  15.     xs = np.linspace(0, 2, 3)
  16.     ys = np.linspace(2, 4, 3)
  17.     formula = '(x + 1) * (y + 2)'
  18.     f = make_func(formula, (x, y))
  19.     print('xs:', xs)
  20.     print('ys:', ys)
  21.     print('Formula:', formula)
  22.     print('->', f(xs, ys))
  23.  
  24. if __name__ == '__main__':
  25.     main()

Dies hat gegenüber der Lösung von MagBen den Vorteil, dass nicht beliebiger (Schad-)Code ausgeführt wird. Außerdem ist es flexibler in Bezug auf zusätzliche Symbole. Bringt einem zwar eine zusätzliche Abhängigkeit an, aber das ist bei wissenschaftlichen Anwendungsgebieten ja sowieso üblich.
shcol (Repo | Doc | PyPi)
Benutzeravatar
snafu
User
Beiträge: 5028
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Re: String in ndarray für numpy wandeln

Beitragvon snafu » Samstag 11. Februar 2017, 10:10

Die Übergabe der SymPy-Symbole kann man übrigens auch abstrahieren (z.B. damit der Aufrufer sich den SymPy-Import spart):
  1. import numpy as np
  2. from sympy import symbols
  3. from sympy.parsing.sympy_parser import parse_expr
  4. from sympy.utilities.lambdify import lambdify
  5.  
  6. def make_func(string, used_symbols='x'):
  7.     return lambdify(symbols(used_symbols), parse_expr(string))
  8.  
  9. def main():
  10.     f = make_func('x*2')
  11.     g = make_func('x+y', used_symbols='x, y')
  12.     xs = np.linspace(0, 1, 5)
  13.     print('x-values:', xs)
  14.     ys = np.linspace(2, 3, 5)
  15.     print('y-values:', ys)
  16.     print('f(x) = x * 2 ->', f(xs))
  17.     print('g(x, y) = x + y ->', g(xs, ys))
  18.  
  19. if __name__ == '__main__':
  20.     main()
shcol (Repo | Doc | PyPi)

Zurück zu „Wissenschaftliches Rechnen“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder