忘れがちなので、出会ってこれは便利と思った python の numpy の機能をメモしておく。

import numpy as np

をしておく。


○ 配列の結合

>>> x1=np.array([1,2,3])
>>> x2=np.array([4,5,6])
>>> z1=np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> z2=np.array([[11,12],[13,14],[15,16]])
>>> z3=np.array([[21,22,23],[24,25,26],[27,28,29]])

>>> np.c_[x1,x2]
array([[1, 4],
          [2, 5],
          [3, 6]])
       
>>> np.r_[x1,x2]
array([1, 2, 3, 4, 5, 6])

>>> np.c_[z1,z2]
array([[ 1,  2,  3, 11, 12],
          [ 4,  5,  6, 13, 14],
          [ 7,  8,  9, 15, 16]])
       
>>> np.r_[z1,z3]
array([[ 1,  2,  3],
          [ 4,  5,  6],
          [ 7,  8,  9],
          [21, 22, 23],
          [24, 25, 26],
          [27, 28, 29]])

>>> np.c_[z1,x2]
array([[1, 2, 3, 4],
          [4, 5, 6, 5],
          [7, 8, 9, 6]])
       
>>> np.r_[z1,x1]
は実行できない。


○ 対角行列を作る

>>> np.diag(x1)
array([[1, 0, 0],
           [0, 2, 0],
           [0, 0, 3]])


○ 正規化する方法

>>> array
array([[ 10.26904011,   0.04298   ,  -0.71467      ],
          [ 10.84101963,   0.164210 ,  -0.62677997],
          [ 15.12874031,   0.06207   ,  -0.68053001],
          [ 15.65050983,   0.06194   ,  -0.72355002],
          [ 42.14241791,   0.07529   ,  -0.67488998],
          [ 18.79310989,   0.08012   ,  -0.56687999],
          [ 23.48911095,   0.08938   ,  -0.62221998],
          [ 24.36981964,   0.09266   ,  -0.65517998],
          [ 40.58003998,   0.15396   ,  -0.52342999],
          [ 11.25899029,   0.049       ,  -0.69778001]], dtype=float32)

という配列があるとする。
1Column の中の数値をひとまとまりとして、 0 から 1 の間に正規化することを考える。
          
>>> (array - array.min(0))/array.ptp(0)
array([[ 0.                ,  0.                ,  0.04437346],
          [ 0.01794537,  1.                ,  0.48356003],
          [ 0.15246893,  0.15746927,  0.21497104],
          [ 0.16883901,  0.15639691,  0.               ],
          [ 1.               ,  0.26651818,  0.24315427],
          [ 0.2674354 ,  0.30635977,  0.78288031],
          [ 0.41476843,  0.38274354,  0.50634634],
          [ 0.44239989,  0.40979955,  0.34164518],
          [ 0.95098174,  0.91544998,  1.                ],
          [ 0.03105884,  0.04965766,  0.12877277]], dtype=float32)
   
min や ptp (peak-to-peak) 関数の引数に 0 を渡す事で、axis 0 (column) 内での最小値や値幅を計算して返すようになる。1 を渡すとaxis 1 (raw) 内の数値セットに対して演算する。

絶対値で正規化するとすると

>>> array/np.abs(array).max(0)
array([[ 0.24367468,  0.261738    , -0.98772717],
          [ 0.25724721,  1.                , -0.86625659],
          [ 0.35899079,  0.37799159, -0.94054312],
          [ 0.3713719  ,  0.37719992, -1.                ],
          [ 1.                ,  0.45849827, -0.9327482  ],
          [ 0.44594285,  0.48791179, -0.78347033],
          [ 0.55737454,  0.544303    , -0.85995436],
          [ 0.57827294,  0.56427747, -0.9055075  ],
          [ 0.96292627,  0.93757993, -0.72341919],
          [ 0.26716527,  0.29839838, -0.9643839  ]], dtype=float32)

この場合は -1 から 1 の間の数値に正規化される。




 Python関連メモの目次