Python NumPy
| Python | Python matplotlib | TensorFlow | Anaconda | 機械学習 | TeX |
目次
Python NumPy
ドキュメント
リファレンス
概要
NumPy
- http://ja.wikipedia.org/wiki/NumPy
- 大部分がCで書かれたPython用の拡張モジュール
- 数値配列、行列を定義し、基本的な操作が可能
SciPy
- http://ja.wikipedia.org/wiki/SciPy
- 先進的な数学をNumPyを使って行うためのPythonのライブラリ
- 信号処理、最適化、統計、など
matplotlib
- 出版物のクオリティで、インタラクティブにプロットするのを容易にするライブラリ
NumPy
- NumPyは多次元配列を扱うライブラリで、主に扱うデータ型は配列である
- 配列は同じ型の要素のセットであり、正の整数のベクターによりインデックス付けされる
Install
apt-getを使ってubuntuへインストール
sudo apt-get install python-numpy python-scipy
PIPを使ってインストール
# pip install numpy
PIPを使ってWindowsにインストール
- Microsoft Visual C++ Compiler for Python 2.7
C:\Python27\Scripts>pip install numpy
ベクトル・array 配列の生成
- 線形代数では要素を縦または横に一列にならべたものをベクトルと呼ぶ
- これは一次元の配列
- 多次元配列を表す数学用語のテンソルを利用して表すと、1階テンソル
- NumPyでは、array()でベクトルを生成する
ベクトル
- ベクトル記法 ( 1 3 5 ) をndarray で表現すると、array([1,3,5])
- このように横方向に並んだものを「行ベクトル」という
- 要素が3つあるので、「3次元行ベクトル」 となり、前から「第n成分」とよぶ
- ベクトル同士の演算は、次元数が同じことが条件
- ベクトル同士の計算は以下のように行われる
[math]\displaystyle{ (a_1 \quad a_2 \quad a_3) \quad + \quad (b_1 \quad b_2 \quad b_3) \quad = \quad (a_1 + b_1 \quad a_2 + b_2 \quad a_3 + b_3) }[/math]
- 行ベクトルであれ列ベクトルであれ同様
[math]\displaystyle{ u=\left(\begin{array}{c}u_1\\u_2\\u_3\end{array}\right)=\left(\begin{array}{c}1\\5\\9\end{array}\right),v=\left(\begin{array}{c}v_1\\v_2\\v_3\end{array}\right)=\left(\begin{array}{c}1\\0\\3\end{array}\right) }[/math]
[math]\displaystyle{ u + v=\left(\begin{array}{c}u_1+v_1\\u_2+v_2\\u_3+v_3\end{array}\right)=\left(\begin{array}{c}1+1\\5+0\\9+3\end{array}\right)=\left(\begin{array}{c}2\\5\\12\end{array}\right) }[/math]
ベクトル要素同士の積
- 行ベクトルと列ベクトル、列ベクトルと行ベクトルの計算は可能
- 行ベクトル同士、列ベクトル同士の掛け算はできない
ベクトルの内積
ベクトル同士の積の和を内積という ベクトルaとbの内積は、
[math]\displaystyle{ {a}\cdot{b} }[/math]と表し、 [math]\displaystyle{ a=\left(\begin{array}{c}2\\3\\\end{array}\right) }[/math]と[math]\displaystyle{ b=\left(\begin{array}{c}4\\5\\\end{array}\right) }[/math] の内積は第一成分同士、第二成分同士を掛けて和を求める
[math]\displaystyle{ {a}\cdot{b}=\left(\begin{array}{c}2\\3\\\end{array}\right)\cdot\left(\begin{array}{c}4\\5\\\end{array}\right)={2}\times{4}+{3}\times{5}=23 }[/math]
ndarrayオブジェクトでは、dot()メソッド
>>> a = np.array([2,3]) >>> b = np.array([4,5]) >>> np.dot(a, b) 23
リストから生成
>>> from numpy import * >>> a = array( [ 10, 20, 30, 40 ] ) >>> a array([10, 20, 30, 40])
arange を使い配列を生成
arange([start,] stop[, step,], dtype=None)
0から始まる整数の配列を生成
>>> b = arange(4) >>> b array([0, 1, 2, 3])
0から3まで 0.5 きざみの配列を生成
>>> np.arange(0,3,0.5) array([ 0. , 0.5, 1. , 1.5, 2. , 2.5])
等しく割り付けられた配列を作成
>>> c = linspace(-pi,pi,3) >>> c array([-3.14159265, 0. , 3.14159265])
既存の配列から生成
>>> a1 = array([10,20,30]) >>> a2 = array([1,2,3]) >>> a3 = (a1 + a2) * 2 >>> a3 array([22, 44, 66])
多次元配列
- 多次元配列で行列を表現
- NumPyは多次元配列に対応
- 一次元の配列(array引数にリスト)はベクトル(vector)、二次元配列(array引数にネストされたリスト)は行列(matrix)となる
テンソルでいうと、2階テンソル
>>> matrix = np.array([[1,2,3], ... [4,5,6], ... [7,8,9]], dtype=float) >>> matrix array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]])
行列
shape で次元を取得
>>> x = ones( (3,4) ) >>> x array([[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]]) >>> x.shape # タプルで次元を取得 (3, 4)
shape 既存の配列の次元を変更
>>> y = arange(12) >>> y array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) >>> y.shape = (3,4) >>> y array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])
ベクトルの算術演算
スカラー演算
- 行列に対してスカラー演算を行うと、すべての成分に対して演算が行われる
>>> m = np.array([[1,2,3],[4,5,6],[7,8,9]],dtype=float) >>> m + 10 array([[11., 12., 13.], [14., 15., 16.], [17., 18., 19.]])
四則演算
- ベクトルのx,y要素数が同じであれば、各要素ごとの算術演算が可能
>>> import numpy as np >>> x = np.array([1,2,3]) >>> y = np.array([4,5,6]) >>> x + y array([5, 7, 9]) >>> x - y array([-3, -3, -3]) >>> x * y array([ 4, 10, 18]) >>> x / y array([0.25, 0.4 , 0.5 ]) >>> x % y array([1, 2, 3])
累乗、平方根
>>> x = np.array([1,2,3,4], dtype=float) >>> np.power(x,2) array([ 1., 4., 9., 16.]) >>> x ** 2 array([ 1., 4., 9., 16.]) >>> np.sqrt(x) array([1. , 1.41421356, 1.73205081, 2. ])
転置行列
- 行列の行と列を入れ替えたもの
行列Aの
[math]\displaystyle{ A=\left(\begin{array}{c}{1}\quad{2}\quad{3}\\{4}\quad{5}\quad{6}\end{array}\right) }[/math]
の転置行列、A'はは
[math]\displaystyle{ A'=\left(\begin{array}{c}{1}\quad{4}\\{2}\quad{5}\\{3}\quad{6}\end{array}\right) }[/math]
- transpose()で求められる
>>> a = np.array([[1,2,3],[4,5,6]],dtype=int) >>> a array([[1, 2, 3], [4, 5, 6]]) >>> np.transpose(a) array([[1, 4], [2, 5], [3, 6]])
参照
箇所を指定
- 行列要素へのインデックスアクセス
[行開始 : 行終了, 列開始: 列終了]
>>> m array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]])
1次元
x[n]
>>> m[1] array([4., 5., 6.])
>>> m[1:] array([[4., 5., 6.], [7., 8., 9.]])
2次元
x[n,m]
>>> m[1:] array([[4., 5., 6.], [7., 8., 9.]])
範囲を指定
1次元
x[start:end:step]
2次元
x[start:end:step,start:end:step]
行を抽出
x[r] x[r,] x[r,:]
列を抽出
x[,:c]
取り出した値が1次元の配列になるため注意 reshape()
条件を満たすデータを取り出す
操作
次元が異なる配列の演算
それぞれの列に掛ける
>>> x = arange(4) >>> x array([0, 1, 2, 3]) >>> x * 2 array([0, 2, 4, 6])
それぞれの行に足し込む
>>> y = arange(10) >>> y.shape = (2,5) >>> y array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) >>> y1 = array([10,20,30,40,50]) >>> y2 = y + y1 >>> y2 array([[10, 21, 32, 43, 54], [15, 26, 37, 48, 59]])
© 2006 矢木浩人