分からんこと多すぎ

何故か就職できたので技術磨く。一人前の多重線形代数使いを目指しつつ、機械学習、データマイニングをやる

/python/numpy/array01

概要


しましま先生の神スライドSciPy神チュートリアルを見つつ、pythonとnumpyを勉強する。ついでにhtmlを勉強する。
要するにコピペなので、当ページに価値はない。

ドットインストールでpythonの基礎勉強した人用。
本で言うなら、みんなのpythonを流し読みしたくらい。





はじめに


pythonモジュール(pythonの場合は、importとかされる定義ファイルがモジュール。他のモジュールを読み込むモジュールがパッケージらしい)のnumpy,scipy,scikit-learnの使い方を実践しつつpythonを勉強する。

環境は以下のものを使用する。


  • MacOSX:10.6.7

  • インタラクティブシェル:bpython(たまにipython)
    関数の引数と変数に対応したメソッドを提示するという、激烈に優秀な補完が出来る

  • 他:

    • homebrew
      オープンソースソフトのインストール

    • pip
      pythonのモジュールなどのインストール

    • vim
      エディタ:pyflakes(構文訂正), vim-ipython(対話), jedi(補完), pep8(形式チェック)

bpythonの用意

brew install pip
pip install bpython

インストールされる場所は、
homebrew/share/python/bpython

pythonの中では、以下のモジュールを使う。

import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import sklearn


行列(配列)の基本


N次元配列を作る方法(2通り)

  1. 多重リスト

    • 初期状態から使える(リストなので当然)

    • あとから形を変更できる

    • 要素の型を統一しなくて良い

  2. n-D-Array

    • numpy環境下でのみ使える

    • 形を変更できない(変更できるが、内部的には削除後、再生成している)

    • 要素の型を統一しなくてはならない

    • 計算が早い

要するに、多重リストは柔軟であり、N-d-Arrayは柔軟ではない分高速である。
機会学習的にはテンソルの形を変更しないので(nモード積:テンソルを行列に変形して行う積が怖いけど、たぶんTheanoがサポートしてくれてる)、N-d-Arrayで良い。

では、実際に行列(テンソル)を作ってみる。

np.array([1,2,3])
np.array([[1,2,3],range(1,4)])
np.arange(60).reshape(3,4,5)

np.arrayというのが、R言語で言うところのarray関数のようだ。
.reshapeで形状変化をさせて、テンソルとかを作るようだ。

実行するとこんなのが出てくる。
ちなみにtypeはnumpy.ndarrayとなる。


Out[47]: array([1, 2, 3])

Out[48]:
array([[1, 2, 3],
[1, 2, 3]])

Out[49]:
array([[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]],

[[20, 21, 22, 23, 24],
[25, 26, 27, 28, 29],
[30, 31, 32, 33, 34],
[35, 36, 37, 38, 39]],

[[40, 41, 42, 43, 44],
[45, 46, 47, 48, 49],
[50, 51, 52, 53, 54],
[55, 56, 57, 58, 59]]])

A = np.arange(60).reshape(3,4,5)
A[0,1,2]
A[range(3),0,0]
A = A.reshape(3,2,5,2)
print A
A[1,1,1,1]


Out[59]: 7
Out[60]: array([ 0, 20, 40])
Out[61]:
array([[[[ 0, 1],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9]],

[[10, 11],
[12, 13],
[14, 15],
[16, 17],
[18, 19]]],


[[[20, 21],
[22, 23],
[24, 25],
[26, 27],
[28, 29]],

[[30, 31],
[32, 33],
[34, 35],
[36, 37],
[38, 39]]],


[[[40, 41],
[42, 43],
[44, 45],
[46, 47],
[48, 49]],

[[50, 51],
[52, 53],
[54, 55],
[56, 57],
[58, 59]]]])
Out[76]: 33

どうもarrayの呼び出しは、reshapeの順番と同じ要素を取り出してくれるようだ。
つまり、reshape(a,b,c,d)と指定して、A[0,0,0,1]とすると、a,b,cの一番目、dの二番目の要素が取り出せる。