2016-12-04 68 views
1

提供的代码工作得很好,但我想使它更有效率(如果可能)。是否有可能使下面的代码更快?

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

请注意,我简化了我的真实问题,我必须使用某个sympy函数的theano_function生成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) 
+0

'numpy.vectorize'它至少会避免创建一个列表,然后将其转换为回数组:https://docs.scipy.org/ DOC/numpy的-1.10.0 /参考/生成/ numpy.vectorize.html。 – JulienD

+0

谢谢你的回应。不幸的是,我仍然不明白如何使它工作。我创建了一个矢量化函数'vectorized_f = np.vectorize(theano_f)'。然而,'vectorized_f(* [1,1,1])'工作正常,但'vectorized_f(np_a)'引发TypeError:缺少必需的输入。所以我认为整个问题是解开'np_a'中的元素。你能否在这种情况下展示如何实际应用矢量化? –

回答

0

也许尝试np.apply_along_axis

>>> 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.]) 
+0

'apply_along_axis'仍然遍历'b'的其他维度。这是一种方便,而不是速度工具。 – hpaulj

+0

感谢您的回复。不幸的是,当我尝试调用函数'np_b = np.apply_along_axis(theano_f,1,np_a)'(我认为这是我应该在我的情况下执行的操作)时,出现错误'错误的维数:期望值0,得到1的形状是(3,)。有什么方法可以用一些聪明的方法来解开'np_a'的元素,这样就可以有效地计算函数'theano_f'了吗?按照hpaulj的说法, –

+0

,它不是一个真正的速度工具,所以它可能无济于事。你仍然可以尝试。你发布的错误意味着你将这个应用到数组的错误是错误的。尝试使用apply_along_axis和第二个参数(轴)设置为0而不是1。 –

相关问题