TEXT/YUBASCRIPT

Web開発とか生物学とかTwitterとかの話題を適当に書いてる

NumPyのリファレンス

NumPyとは

Pythonの数値計算ライブラリ。中身がCで書かれているため、適切に使えばすごく速い計算ができる。 統計処理の関数(および日本語リファレンス)はRのほうが充実してる気がする。

インストール

Ubuntuの場合
$ sudo apt-get install python-numpy
WindowsとかMacとかで使いたい場合はこのサイトが参考になる。

モジュール名がnumpyなので、Pythonコード内で

import numpy
とすれば使えるが、いちいち5文字も書くの面倒なので
import numpy as np
と省略するか、もっと割りきって
from numpy import *
とする。以下この最後のやり方でインポートしたつもりで書く。

データ型

NumPyで使うデータ型は以下のとおり。
bool inti int8 int16 int32 int64 unit8 unit16 unit32 unit64 float16 float32 float64 complex64 complex128
当たり前だが全部数値型である。文字列などというリア充な型はPython標準を使うが良かろう。 unitとは符号なしの整数。intiはプラットフォーム依存の整数(つまり32か64)。

多次元配列

NumPyとは一言で要約すれば多次元配列(ndarray)を作ってそれをごにょごにょするライブラリである。なので多次元配列を作らないと始まらない。
a = array([1,2,3])     # array([1,2,3]), 1次元配列(ベクトル)
a = arange(5)          # array([0,1,2,3,4])
a = arange(3,9,2)      # array([3,5,7]) 開始・終了・ステップ幅の順
a = linspace(0,8,5)    # array([0.,2.,4.,6.,8.]) 開始・終了・分割数の順

a = array([1,2],[3,4]) # array([1,2],[3,4]), 2次元配列(行列)
a = eye(3)             # 3x3単位行列
a = zeros((2,3))          # 2x3ゼロ行列
多次元配列を定義すると、自動的にいくつかのプロパティが定義される。
a                 # a自体
a.dtype           # aのデータ型  int64とか
a.shape           # aの次元 (2,3) とか
a.size            # aの要素数
a.nbytes          # aのデータのバイト数
型変換は以下のように行う。
# aはNumPyの多次元配列
b = a.tolist()     # aをPython標準のリスト型に変換
a = array(b)       # bをNumPyの配列に変換
1次元・多次元の相互変換
# reshape()で指定した形状に折りたたみ、ravel()で戻す

a = arange(12)        # [0,1, ..., 11]
b = a.reshape(3,4)    # [[0,1,2], ..., [9,10,11]]
c = b.ravel()         # [0,1, ..., 11]
d = b.flattern()      # [0,1, ..., 11] ravelと違いメモリを新たに確保

要素へのアクセス

# 1次元配列
a[3:5]         # aの3〜5番目の要素
a[:5]          # aの最初〜5番目の要素
a[3:]          # aの3〜最後の要素
a[:]           # aの全要素
a[3:9:2]       # aの3,5,7番目の要素

# 多次元配列
a[3,4]           # aの3行4列目の要素(スカラー値)
a[:,4]           # aの4列目(1次元配列)

要素への演算

a + 1            # aの各要素に1を加算
log(a)           # 各要素の自然対数
a.astype(int)    # aの各要素をint型にする
a.flat = 10      # aの各要素を全て10にする
""" a=10 とするとaが10というスカラー値になってしまう """

多次元配列間の演算

a + b       # 各要素の和
a * b       # 各要素の積
dot(a,b)   # 内積
cross(a,b)  # 外積

hstack(a,b) # a,bを横に結合した行列
vstack(a,b) # a,bを縦に結合した行列

線形代数

# aが行列、bがベクトルとして

linalg.inv(a)         # aの逆行列
linalg.pinv(a)        # aの擬似逆行列(三角化するやつ)
linalg.solve(a,b)     # 連立方程式 ax=b の解
linalg.eigvals(a)     # aの固有値
linalg.eig(a)         # aの固有値と、固有ベクトルからなる行列

統計関数

average(a)        # 平均
var(a)            # 分散
mean(a)           # 中間値
median(a)         # 最頻値
max(a)            # 最大値
min(a)            # 最小値

"""
ただしmax()とmin()はPython組込関数とかぶるため
from numpy import *
でインポートした場合は使えない。a.max(), a.min()で代用されたし。
"""

乱数

random.rand(2,3)           # 0〜1の一様乱数からなる2x3行列
random.randn(2,3)          # 標準正規分布に従う乱数からなる(ry
random.randint(0,10,(2,3)) # 0以上10未満の整数からなる(ry

ファイル読み書き

from numpy import *

a = arange(10)
savetxt("output.dat", a)      # output.dat に書き込む
""" 1次元か2次元でないとエラー """

b = loadtxt('data.csv', delimiter=',')    # data.csv をCSVとして読み込む
""" ファイル内にコメント行がある場合は comments='#' のように指定 """

その他メモ

2次元配列にはndarray型の他にmatrix型があって挙動が微妙に違う。asarray()asmatrix()関数を使えば相互変換できる。

NumPyで出したデータを可視化するにはmatplotlibという大変イケメンなライブラリがある。あと信号処理とか最適化とかいったもっとややこしいライブラリを備えたSciPyというのもある。そのへんについても機会があったら書く。

書籍

本稿は主にこれ(洋書)を読んで書いた。

日本語のNumPy書籍は無いっぽい。そもそもPython自体が日本でマイナーというアレ。 科学技術系のスクリプトはだいたいPythonなので理系の人は覚えておいたほうがいいと思うんだが。