2016-12-04 16 views
1

提供されたコードは完璧に機能しますが、(可能であれば)より効率的にしたいと思います。次のコードを高速化することは可能ですか?

私の質問は、アレイnp_bをより効率的に生成できるかどうかです。特に、theano_f(*np_a)を介してnp_aのすべての要素の関数theano_fを計算して、ブロードキャスト(?)またはベクトル化(?)を適用することは可能ですか?

実際の問題を単純化し、theano_fを生成する必要があります。theano_functionをsympy関数から使用し、実際の配列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/reference/generated/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、 (3、)で1を得ました '' nano_f'関数が効率的に計算されるように 'np_a'の要素をいくつかスマートな方法で解く方法はありますか? –

+0

がhpauljとして言った、それは本当にスピードツールではないので、おそらく助けにならないでしょう。あなたはまだ試みることができます。投稿したエラーは、これを配列に適用するディメンションが間違っていることを意味します。 apply_along_axisを、第2引数(軸)を1ではなく0に設定して試してください。 –

関連する問題