2016-08-03 76 views
1

我得到了sympy阵列表达式sympy数组numpy的阵列

sympyarray = Matrix([[2/(dx**2*(exp(I*theta) + 1)), -2*exp(-I*theta)/dx**2, 2*exp(-I*theta)/(dx**2*(exp(I*theta) + 1))]]) 

,并希望把它改造成一个numpy的阵列

numpyarray=np.array([2/(dx**2*(np.exp(1j*theta) + 1)), -2*np.exp(-1j*theta)/dx**2, 2*np.exp(-1j*theta)/(dx**2*(np.exp(1j*theta) + 1))]) 

,不知是否有这样做没有什么好的办法?

我的方法到现在为止一直是以下几点:

  1. 转换复杂的sympyarray “我” 到 “1J” 使用sympy.subs
  2. 使用转换sympy阵列到阵列numpy的

    numpyarray = sympyarray.tolist()

  3. 插入“np”。因为.tolist()不会将sympy指数变为numpy指数,所以在打印的numpyarray中的所有exp(1j * theta)之前。

它肯定是一个更简单的方法?

注意:就我的知识而言,lambdify并不是这里的答案。在阅读文档时,lambdify将sympy表达式转换为需要数值输入的函数?还是我离开?

+0

你希望评估'theta'和'dx',将数值'numpy'阵列,或将其作为保持返回一个ndarray的功能? – Benjamin

+0

我将在数组中插入'theta'和'dx'的值,但是我需要它们是动态的,以便能够更改dx和theta值。或者是你的问题的答案? –

回答

1

使用lambdify

In [10]: expr = Matrix([[2/(dx**2*(exp(I*theta) + 1)), -2*exp(-I*theta)/dx**2, 2*exp(-I*theta)/(dx**2*(exp(I*theta) + 1))]]) 

In [12]: f = lambdify([dx, theta], expr, 'numpy') 

In [15]: f(np.array([1], dtype=complex), np.array([np.pi], dtype=complex)) 
Out[15]: 
array([[[ 0. -1.63312394e+16j], 
     [ 2. +2.44929360e-16j], 
     [-2. +1.63312394e+16j]]])