ベクトルの繰り返しで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.        ]