Pertanyaan Evaluasi ekspresi simbol dari berbagai nilai


Saya bereksperimen dengan sympy dan saya telah menemukan masalah yang tidak bisa saya kerjakan.

Menggunakan scipy saya dapat menulis ekspresi dan mengevaluasinya untuk array nilai x sebagai berikut:

import scipy
xvals = scipy.arange(-100,100,0.1)
f = lambda x: x**2
f(xvals)

Menggunakan sympy saya dapat menulis ekspresi yang sama seperti berikut:

import sympy
x = sympy.symbols('x')
g = x**2

Saya dapat mengevaluasi ekspresi ini untuk satu nilai dengan melakukan hal berikut:

g.evalf(subs={x:10})

Namun saya tidak bisa mencari cara untuk mengevaluasinya untuk array nilai x, seperti yang saya lakukan dengan scipy. Bagaimana saya melakukan ini?


32
2018-05-21 02:17


asal


Jawaban:


Pertama-tama, saat ini SymPy tidak menjamin dukungan untuk numpy array yang Anda inginkan dalam kasus ini. Periksa laporan bug ini http://code.google.com/p/sympy/issues/detail?id=537

Kedua, Jika Anda ingin mengevaluasi sesuatu secara numerik banyak nilai-nilai SymPy bukan pilihan terbaik (itu adalah perpustakaan simbolis setelah semua). Gunakan numpy dan scipy.

Namun, alasan yang sah untuk mengevaluasi sesuatu secara numerik adalah bahwa menurunkan ekspresi yang akan dievaluasi itu sulit sehingga Anda mendapatkannya dalam SymPy dan kemudian mengevaluasinya di NumPy / SciPy / C / Fortran. Untuk menerjemahkan ekspresi ke numpy hanya digunakan

from sympy.utilities.lambdify import lambdify
func = lambdify(x, big_expression_containing_x,'numpy') # returns a numpy-ready function
numpy_array_of_results = func(numpy_array_of_arguments)

Periksa docstring lambdify untuk detail lebih lanjut. Ketahuilah bahwa lambdify masih memiliki beberapa masalah dan mungkin perlu menulis ulang.

Dan hanya sebagai catatan samping, jika Anda ingin mengevaluasi ekspresi sangat berkali-kali, Anda dapat menggunakan modul codegen / otowrap dari sympy untuk membuat fortran atau kode C yang dibungkus dan dapat dipanggil dari python.

EDIT: Daftar pembaruan cara melakukan numerik di SymPy dapat ditemukan di wiki https://github.com/sympy/sympy/wiki/Philosophy-of-Numerics-and-Code-Generation-in-SymPy


38
2018-05-21 10:55



Sementara jawaban yang diterima memperjelas bahwa OP sedang mencari numerik evaluasi, saya akan tetap menunjukkan bahwa seseorang juga dapat memilikinya simbolis evaluasi dengan menggunakan symarray:

import sympy
xs = sympy.symarray('x', 10)
f = lambda x: x**2
f(xs)

hasil

array([x_0**2, x_1**2, x_2**2, x_3**2, x_4**2, x_5**2, x_6**2, x_7**2,
       x_8**2, x_9**2], dtype=object)

Perhatikan bahwa ini juga menggunakan numpy array internal, tetapi satu diisi dengan sympy.Expressions.


7
2018-04-10 07:43



mencoba

import sympy
x = sympy.symbols('x')
f = lambda x: x**2
print [f(k) for k in range(4)]

atau Anda juga bisa mencoba

g = x**2
print [g.subs(x,k) for k in range(4)]

-3
2018-05-21 05:26