2012-05-21 37 views
28

Tôi đang thử nghiệm với sympy và tôi đã gặp phải vấn đề mà tôi không thể làm việc.Đánh giá biểu hiện sympy từ một mảng giá trị

Sử dụng scipy tôi có thể viết một biểu thức và đánh giá nó cho một mảng các giá trị x như sau:

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

Sử dụng sympy tôi có thể viết biểu thức tương tự như sau:

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

tôi có thể đánh giá biểu thức này cho một giá trị bằng cách thực hiện như sau:

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

Tuy nhiên tôi có thể 't làm việc ra làm thế nào để đánh giá nó cho một mảng các giá trị x, như tôi đã làm với scipy. Làm thế nào tôi sẽ làm điều này?

Trả lời

35

Trước hết, tại thời điểm SymPy không đảm bảo hỗ trợ cho mảng NumPy đó là những gì bạn muốn trong trường hợp này. Kiểm tra báo cáo lỗi này http://code.google.com/p/sympy/issues/detail?id=537

Thứ hai, Nếu bạn muốn đánh giá một số thứ tự cho số nhiều giá trị SymPy không phải là lựa chọn tốt nhất (sau này là thư viện biểu tượng). Sử dụng numpy và scipy.

Tuy nhiên, một lý do hợp lệ để đánh giá điều gì đó sẽ khiến cho biểu thức được đánh giá là khó để bạn lấy nó trong SymPy và sau đó đánh giá nó trong NumPy/SciPy/C/Fortran. Để dịch biểu thức thành dạng chỉ cần sử dụng

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) 

Kiểm tra chuỗi tài liệu của lambdify để biết thêm chi tiết. Hãy nhận biết rằng lambdify vẫn có một số vấn đề và có thể cần viết lại.

Và nếu bạn muốn đánh giá biểu thức thực sự nhiều lần, bạn có thể sử dụng mô-đun codegen/autowrap từ sympy để tạo mã fortran hoặc C được gói và gọi từ python.

EDIT: Một danh sách cập nhật các cách để làm numerics trong SymPy có thể được tìm thấy trên wiki https://github.com/sympy/sympy/wiki/Philosophy-of-Numerics-and-Code-Generation-in-SymPy

-3

thử

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

hoặc bạn cũng có thể thử

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

Ví dụ đầu tiên của bạn không sử dụng sympy theo bất kỳ cách nào. Biểu tượng mà bạn xác định không được truy cập trong lambda.Hơn nữa, câu hỏi đặt ra là về các mảng cứng nhắc và có lẽ tất cả các hoạt động đặc biệt trên mỗi phần tử được hỗ trợ bởi sự lố bịch. Đây không phải là các tính năng có trong danh sách của python (những gì bạn đang thực sự sử dụng). – Krastanov

7

Trong khi the accepted answer làm cho nó rõ ràng rằng OP đang tìm kiếm số đánh giá, tôi vẫn sẽ chỉ ra rằng người ta cũng có thể có biểu tượng đánh giá bằng cách sử dụng symarray:

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

mang

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) 

Lưu ý rằng điều này cũng sử dụng một mảng numpy trong nội bộ, nhưng được điền bằng sympy.Expr các bài viết.

+0

Nhưng symarray không gán một giá trị số cho mỗi x_i, vậy làm thế nào bạn sẽ đánh giá biểu thức cho arange specfied trong câu hỏi? – fccoelho

+0

@fccoelho Tôi muốn sử dụng numpy để bắt đầu, hoặc ít nhất là 'lambdify' từ câu trả lời được chấp nhận. Nhưng nếu vì một số lý do bạn thực sự có một loạt các biểu thức biểu tượng, có thể bạn sẽ phải sử dụng một danh sách hiểu (hoặc 'for' vòng lặp). Có lẽ có một cách dễ dàng hơn, nhưng tôi không bao giờ bận tâm với 'symarray' nhiều. Câu trả lời của tôi thực sự chỉ ở đây như là một sidenote –

Các vấn đề liên quan