2016-10-19 10 views
4

最後に、Pythonの代わりにCでnumpyのベクトル化と関数呼び出しを利用するために、以下のコードで明示的なループをすべて削除します。Numpy:データセットに適用された関数の関数形式のパラメータをベクトル化する方法

以下は、pythonでnumpyを使用するために簡略化されています。 Iは、以下の二次関数を有する:

def quadratic_func(a,b,c,x): 
    return a*x*x + b*x + c 

Iは、Bは、与えられた入力データXと同じ大きさの出力データy C(もちろん、これは線形回帰によって行われるべきでの選択を最適化しようとしてい...しかしユーモア私)。 len(x)= 100と言う。スカラーa、b、cをベクトル化して長さ100の結果を返すのは簡単です。

a、b、cは[-10,10]の中にあり、私はグリッド最小二乗誤差で点を選ぶ。 1331個のノードの各々について

a=np.arange(-10.0, 10.01, 2.0) 
nodes=np.array(np.meshgrid(a,a,a)).T.reshape(-1,3) #3-d cartesian product with array of nodes 

、Iは長さ100の戻り値の全て1331計算したいです。

res=[] 
x=np.random.uniform(-5.0,5.0, 100) 
for node in nodes: 
    res.append(quadratic_func(*node, x=x)) 

1331個のアイテムのxにquadratic_func呼び出しの結果である100個の値を持つ各の私のリストを取得するようにどのように私は放送を利用することができますか?答えは、私が探しているマグニチュードスピードの向上のオーダーを得るために、ベクトル化、放送などを使用しなければなりません。また、答えはquadratic_funcを呼び出す必要があります - より一般的には、my_func(* node、x = x)。

現実には、私は凸面に近くなく、極小値が多い非線形関数を最適化しています。私が「正しい」地方の最低限に達することができるなら、それはすばらしい機能的なフォームです - 私はすでにその方法を知っていますが、より速くそこに着きたいです!

答えて

1

broadcastingnp.einsumの組み合わせ使用して一つのアプローチ - np.dot

np.einsum('ij,jk->ik',nodes,x**np.array([2,1,0])[:,None]) 

マトリックス乗算を使用して別のものを - 私はあなたが何をしているか見

nodes.dot(x**np.array([2,1,0])[:,None]) 
+0

に、しかし、より一般的な何かを探してそれは、先験的な機能が何であるかを知る必要はありません。私は最終的に私のオプティマイザにパラメータを最適化しようとしている目的関数を渡すことができたいと思いますし、関数形式が多項式、sqrts、ログなどのいくつかの組み合わせになるとは思いません。 quadratic_funcの呼び出し? – FinanceGuyThatCantCode

+0

@FinanceGuyThatCantCode NumPyのベクトル化にはそういったことがあります。一般的なfuncを使って速度を上げる方法はありません。 numPy関数やufuncに変換できない特定の機能を使用する場合は、cythonまたはnumbaを調べることができます。 – Divakar

+0

それは私がそれを自分で理解できなかった理由だと思います!しかし、素晴らしいフィーチャになるだろう...と私は今日私のオフィスにいたコンティニュアムの人に尋ねることができたと思う! – FinanceGuyThatCantCode

関連する問題