Python 有可能使下面的代码更快吗?

Python 有可能使下面的代码更快吗?,python,numpy,theano,sympy,Python,Numpy,Theano,Sympy,所提供的代码工作得非常好,但我希望它更高效(如果可能的话) 我的问题是是否可以更有效地生成数组np_b。特别是,是否可以通过theano_f(*np_a)计算np_a的所有元素上的函数theano_f,以便应用广播(?)或矢量化(?) 请注意,我已经简化了我的实际问题,并且我必须使用theano_函数从一些symphy函数生成theano_f,实际数组np_a包含许多元素 from sympy import symbols from sympy.printing.theanocode impor

所提供的代码工作得非常好,但我希望它更高效(如果可能的话)

我的问题是是否可以更有效地生成数组
np_b
。特别是,是否可以通过
theano_f(*np_a)
计算
np_a
的所有元素上的函数
theano_f
,以便应用广播(?)或矢量化(?)

请注意,我已经简化了我的实际问题,并且我必须使用
theano_函数
从一些symphy函数生成
theano_f
,实际数组
np_a
包含许多元素

from sympy import symbols
from sympy.printing.theanocode import theano_function
import numpy as np

x,y,z = symbols('x y z')
sympy_f = x+y+z # a sympy-function which depends on 3 variables
theano_f = theano_function([x,y,z], [sympy_f]) # Theano-compiled function which depends on 3 scalars
np_a = np.array([[1,1,1],[2,2,2],[-1,-2,0],[0,2,0]])
np_b = np.array([theano_f(*x) for x in np_a]) # The obtained four numbers 
#should be recorded into the numpy-array np_b
print(np_b)
也许可以试试:

也许可以试试:


numpy.vectorize
至少可以避免创建列表,然后将其转换回数组:。感谢您的回复。不幸的是,我仍然不明白如何让它工作。我已经创建了一个向量化函数
vectoriazed\u f=np.vectoriaze(theano\u f)
。但是,
vectoriazed_f(*[1,1,1])
工作正常,但是
vectoriazed_f(np_a)
会引发类型错误:缺少必需的输入。因此,我认为整个问题在于如何在
np\u a
中解包元素。您能否演示如何在这种情况下实际应用矢量化?
numpy.vectorize
至少可以避免创建列表,然后将其转换回数组:。感谢您的回复。不幸的是,我仍然不明白如何让它工作。我已经创建了一个向量化函数
vectoriazed\u f=np.vectoriaze(theano\u f)
。但是,
vectoriazed_f(*[1,1,1])
工作正常,但是
vectoriazed_f(np_a)
会引发类型错误:缺少必需的输入。因此,我认为整个问题在于如何在
np\u a
中解包元素。您能演示一下在这种情况下如何实际应用矢量化吗?
apply\u沿_轴
仍然在
b
的其他维度上迭代。这是一个方便的工具,不是一个快速的工具。谢谢你的回复。不幸的是,当我试图调用函数
np\u b=np.apply\u沿着轴(theano\u f,1,np\u a)
(我想这就是我在这种情况下应该做的事情),出现了一个错误“维数错误:预期为0,形状为1(3,)有没有什么方法可以以某种智能的方式解包
np_a
的元素,从而有效地计算函数
theano_f
?正如hpaulj所说,它不是一个真正的速度工具,因此可能不会有帮助。不过你还是可以试试。您发布的错误表示您将此应用于数组的维度错误。尝试使用沿轴应用,将第二个参数(轴)设置为0而不是1。
apply\u沿轴应用
仍会在
b
的其他维度上迭代。这是一个方便的工具,不是一个快速的工具。谢谢你的回复。不幸的是,当我试图调用函数
np\u b=np.apply\u沿着轴(theano\u f,1,np\u a)
(我想这就是我在这种情况下应该做的事情),出现了一个错误“维数错误:预期为0,形状为1(3,)有没有什么方法可以以某种智能的方式解包
np_a
的元素,从而有效地计算函数
theano_f
?正如hpaulj所说,它不是一个真正的速度工具,因此可能不会有帮助。不过你还是可以试试。您发布的错误表示您将此应用于数组的维度错误。尝试使用沿_轴应用_,并将第二个参数(轴)设置为0而不是1。
>>> def my_func(a):
...     """Average first and last element of a 1-D array"""
...     return (a[0] + a[-1]) * 0.5
>>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> np.apply_along_axis(my_func, 0, b)
array([ 4.,  5.,  6.])
>>> np.apply_along_axis(my_func, 1, b)
array([ 2.,  5.,  8.])