Tôi đang sử dụng sympy để tạo ra một số hàm để tính toán số. Vì vậy, tôi lambdify một biểu thức một vectorize nó để sử dụng nó với mảng numpy. Dưới đây là một ví dụ:Tăng tốc chức năng sympy-lamdified và vectorized
import numpy as np
import sympy as sp
def numpy_function():
x, y, z = np.mgrid[0:1:40*1j, 0:1:40*1j, 0:1:40*1j]
T = (1 - np.cos(2*np.pi*x))*(1 - np.cos(2*np.pi*y))*np.sin(np.pi*z)*0.1
return T
def sympy_function():
x, y, z = sp.Symbol("x"), sp.Symbol("y"), sp.Symbol("z")
T = (1 - sp.cos(2*sp.pi*x))*(1 - sp.cos(2*sp.pi*y))*sp.sin(sp.pi*z)*0.1
lambda_function = np.vectorize(sp.lambdify((x, y, z), T, "numpy"))
x, y, z = np.mgrid[0:1:40*1j, 0:1:40*1j, 0:1:40*1j]
T = lambda_function(x,y,z)
return T
Vấn đề giữa phiên bản sympy và một phiên bản numpy tinh khiết là tức tốc
In [3]: timeit test.numpy_function()
100 loops, best of 3: 11.9 ms per loop
vs
In [4]: timeit test.sympy_function()
1 loops, best of 3: 634 ms per loop
Vậy có cách nào để có được gần với tốc độ của phiên bản numpy? Tôi nghĩ rằng np.vectorize là khá chậm nhưng bằng cách nào đó một số phần của mã của tôi không hoạt động mà không có nó. Cảm ơn bạn đã đề xuất.
EDIT: Vì vậy, tôi tìm thấy lý do tại sao chức năng vectorize là cần thiết, ví dụ:
In [35]: y = np.arange(10)
In [36]: f = sp.lambdify(x,sin(x),"numpy")
In [37]: f(y)
Out[37]:
array([ 0. , 0.84147098, 0.90929743, 0.14112001, -0.7568025 ,
-0.95892427, -0.2794155 , 0.6569866 , 0.98935825, 0.41211849])
này dường như làm việc tốt tuy nhiên:
In [38]: y = np.arange(10)
In [39]: f = sp.lambdify(x,1,"numpy")
In [40]: f(y)
Out[40]: 1
Vì vậy, đối biểu hiện đơn giản như 1
hàm này không trả về một mảng. Có cách nào để sửa lỗi này và đây không phải là loại lỗi hoặc thiết kế ít nhất không nhất quán?
Cảm ơn bạn đã trả lời. Vấn đề của tôi là tôi có một cái gì đó như self.T = T (x, y, z) vì vậy trong trường hợp này phát sóng không hoạt động. Cách nào tốt nhất để làm việc này ? – jrsm
Có vẻ như 'numpy.array' là một no-op khi được gọi với một mảng, vì vậy bạn có thể sử dụng' np.array (T (x, y, z)) 'để đảm bảo rằng kết quả luôn luôn là một mảng. – asmeurer
Mặc dù tôi vẫn không hiểu tại sao trường hợp sử dụng của bạn không hoạt động với phát sóng. – asmeurer