ベクトルの繰り返しでmatrixをつくる
一次元のarrayの繰り返しでmatrixを作る機会はそれなりに多い。Matlabではonesとのクロネッカー積を使っていたが、pythonでは代わりにrepeatとtileを使っている。
a=np.arange(3) a Out[0]: array([0, 1, 2])
列ベクトルとみなして行方向に繰り返すなら、repeat+reshapeか、tile+reshape+transpose。
a.repeat(2).reshape([3,2]) Out[1]: array([[0, 0], [1, 1], [2, 2]]) np.tile(a,2).reshape([2,3]).T Out[2]: array([[0, 0], [1, 1], [2, 2]])
行ベクトルとみなして列方向に繰り返す時は逆に、repeatの方にtransposeが必要。
np.tile(a,4).reshape([4,3]) Out[3]: array([[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]) a.repeat(4).reshape([3,4]).T Out[4]: array([[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]])
scipy.optimize: argsの付け方
方法1:inputにアスタリスクをつけてタプルで受け取れるようにする。
def func(x,*a): return np.sum((x-a)**2)+1 scipy.optimize.minimize(func,x0=np.array([7,10,3.]),method='SLSQP',args=(2.5, ))
方法2:関数自体を返す関数を作る。
def make_func(): def func(x,a): return np.sum((x-a)**2)+1 return func scipy.optimize.minimize(func,x0=np.array([7,10,3.]),method='SLSQP',args=(2.5, ))
二つ目のやり方はclass内でselfを受け取る時に使える。
def make_gmmobjg(self): def gmmobjg(theta2,...): ..... return f return gmmobjg
scipy.optimize:制約条件の付け方
import numpy as np import scipy.optimize def func(x): return np.sum((x-2.5)**2)+1
inequality constraintは、returnが正であるような形で関数を書いて指定する。
def con1(x): return 2-x[0] cons1 = ({'type':'ineq','fun':con1})
boundaryはnp.arrayで指定できる。
b1=np.array([[0,10],[0,3.],[0,1.]])
a=scipy.optimize.minimize(func,x0=np.array([7,10,3.]),method='SLSQP',constraints=cons1,bounds=b1) print(a.x) [ 2. 2.49999999 1. ]