| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

Python NumPy

提供: MyMemoWiki
2021年10月24日 (日) 00:49時点におけるPiroto (トーク | 投稿記録)による版 (→‎操作)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

| Python | Python matplotlib | TensorFlow | Anaconda | 機械学習 | TeX |

Python NumPy

ドキュメント


リファレンス


概要


NumPy


SciPy


matplotlib

  • 出版物のクオリティで、インタラクティブにプロットするのを容易にするライブラリ

NumPy

  • NumPyは多次元配列を扱うライブラリで、主に扱うデータ型は配列である
  • 配列は同じ型の要素のセットであり、正の整数のベクターによりインデックス付けされる

Install


apt-getを使ってubuntuへインストール

sudo apt-get install python-numpy python-scipy
PIPを使ってインストール

# pip install numpy
PIPを使ってWindowsにインストール
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]])