#author("2021-02-15T12:24:36+00:00","default:ibisforest","ibisforest")
* numpy [#zac1d944]

#contents

//ここには %項目の説明を書いてください.よろしければ署名しておいてください.

[[python]] の数値計算関連ライブラリ numpy のtipsまとめ

> -- しましま

* リンク集 [#a87a4d25]

//関連するWWW資源があればリンクしてください.

** 公式サイト [#c63e28d5]

-[[NumPy>http://numpy.scipy.org//]]:数値演算の基本
-[[SciPy>http://www.scipy.org//]]:より高度な関数
-[[SciKits>http://scikits.appspot.com/]]:さらに進んだ科学技術計算処理

** パッケージ [#z10f277d]

pip や easy_install によるインストールの前に多くの外部ライブラリやfortranコンパイラなどが必要になるので,numpy等の科学技術計算パッケージをインストールするには以下のようなパッケージを一般には利用する:
- 商用(サポートなしなら無料でも利用できる)
-- [[Anaconda>https://store.continuum.io/]]:無料版でもIntel MKLが使える
-- [[Enthought Canopy>http://www.enthought.com/]]
- フリー
-- [[Unofficial Windows Binaries for Python Extension Packages>http://www.lfd.uci.edu/~gohlke/pythonlibs/]] (個人ベースの管理で非公式版)

** その他 [#n5b6f24f]

- [[pyvideo.org>http://pyvideo.org/]]:PyCon, SciPy, PyData などの講演ビデオリンク集
- [[100 numpy exercises>https://github.com/rougier/numpy-100]]:練習問題
- [[Pythonidae>http://svaksha.github.io/pythonidae/]]:Python関連のライブラリのリンク集
- [[SciPy Central>http://scipy-central.org/]]:SciPy 関連コードスニペット
- [[SciPy Advice>http://advice.mechanicalkern.com/]]:集合知FAQサイト
- [[SciPy course>http://www.rexx.com/~dkuhlman/scipy_course_01.html]] @ Dave Kuhlman
- IPythonノートブック
-- [[IPython notebook viewer>http://nbviewer.ipython.org/]]:ノートブックの共有サイト
-- [[A gallery of interesting IPython Notebooks>https://github.com/ipython/ipython/wiki/A-gallery-of-interesting-IPython-Notebooks]]
-[[Python for Biologist>http://pythonforbiologists.com/]]:バイオ系向けPython情報

** 資料 [#ic069832]

- 本家サイトの基礎資料
--[[Tentative Numpy Tutorial>http://www.scipy.org/Tentative_NumPy_Tutorial]]:ずっと Tentative のチュートリアル.indexing とかの基本だけ.でも最初に読んでおくのは良いとも思う.
--[[Numpy/Scipy Cookbook>http://www.scipy.org/Cookbook]]:すごい力作.
--[[Numpy Example List>http://wiki.scipy.org/Numpy_Example_List]]:一番役に立つけど,ページが大きすぎるのでローカルにコピーしておくと良いと思う
--[[Numpy for Matlab Users>http://www.scipy.org/NumPy_for_Matlab_Users]]:Matlab使いのためのコマンド対応表.
--[[A beginners guide to using Python for performance computing>http://www.scipy.org/PerformancePython]]
-[[Python for Scientific Computing Conference>http://conference.scipy.org/]]:各種ライブラリのチュートリアル資料・ビデオ
-- [[Planet Scipy>http://planet.scipy.org/]]:科学技術系での Python 利用についてのブログ
-- [[Topical Software>http://www.scipy.org/Topical_Software]]:Scipy.org の科学技術計算関係ソフトリンク集
- [[Data Science in Python>http://blog.yhathq.com/posts/data-science-in-python-tutorial.html]]:DataGotham2013でのチュートリアル.scikit-learn での分析.
- [[NumPy MedKit>http://mentat.za.net/numpy/numpy_advanced_slides/]]:broadcasting や indexing がよく分かるチュートリアル
- [[Scientific Computing with Python>http://www.scientificpython.net/]]
- matlabユーザ向け
--[[Numerical Computing in Python: A Guide for Matlab Users>http://web.bryant.edu/~bblais/bryant/numerical_computing/]]
--[[Migration @ BCPy2000>http://bci2000.org/downloads/BCPy2000/Migration.html]]:matlabの機能に対応するパッケージの紹介
- チートシート
--[[Python Cheat Sheets>https://drive.google.com/folderview?id=0ByIrJAE4KMTtaGhRcXkxNHhmY2M]]:Python, Pandas, Matplotlibのチートシート
--[[Thesaurus of Mathematical Languages, or MATLAB synonymous commands in Python/NumPy>http://mathesaurus.sourceforge.net/]]:matlabとのコマンド対訳
--[[scipy array tip sheet>http://pages.physics.cornell.edu/~myers/teaching/ComputationalMethods/python/arrays.html]]
--[[Numerical Analysis Software: Fortran, MATLAB, R, NumPy>http://hyperpolyglot.org/numerical-analysis]]:記述の比較
--[[Numeric matrix manipulation: The cheat sheet for MATLAB, Python NumPy, R, and Julia>http://sebastianraschka.com/Articles/2014_matrix_cheatsheet.html]]
-[[PyData Tokyo>http://pydatatokyo.connpass.com/]]:Pythonを使ったデータ分析勉強会
-[[Tokyo.SciPy>http://groups.google.com/group/tokyo_scipy]]:東京で開催している Numpy/SciPy 勉強会
--[[資料スライド一覧>http://www.slideshare.net/tag/tokyoscipy]]
--[[サンプルコードなど @ github>https://github.com/organizations/tokyo-scipy]]
- [[Science with Python>https://groups.google.com/forum/?fromgroups#!forum/science-with-python]]:科学分野での Python 利用について
- [[科学技術計算のために Python を始めよう>http://www.ike-dyn.ritsumei.ac.jp/~uchida/scipy-lecture-notes/]]
-- [[Scipy Lecture Notes>http://www.scipy-lectures.org/]] 原文:翻訳版よりだいぶ追記されている
- [[Introduction to Python Programming @ NCLab>http://femhub.com/textbook-python/]] NumPy と matplotlib についてもちょっと載ってる Python のチュートリアル
- [[機械学習 はじめよう @ 技術評論社>http://gihyo.jp/dev/serial/01/machine-learning]]:機械学習の入門記事とそのpython実装コード
- [[機械学習のPythonとの出会い>http://www.kamishima.net/mlmpyja/]]:機械学習アルゴリズムの実装を通じた Numpy/SciPy のチュートリアル
- [[Python による科学技術計算の概要>http://www.kamishima.net/archive/scipy-overview.pdf]]:NumPy / SciPy を中心としたPython による科学技術計算実装の tips と関連パッケージの紹介

* Numpyの概要 [#q38168ab]

ここでの記述は
 import numpy as np
 import scipy as sp
とされていることが前提.ここにはよく使うものだけを示しているので,詳細はリファレンスを参照のこと.

** [[NumPy: Array objects>http://docs.scipy.org/doc/numpy/reference/arrays.html]] [#fde32c63]

*** N-次元配列 (ndarray) [#pf6b175a]
- [[The N-dimensional array (ndarray)>http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html]]

ndarray オブジェクトは Numpy の配列で,python の配列と比べて,格納される内容の型を指定してメモリの効率化を図ったり,様々な操作が可能になる.ただし,python のようにリストではないので,配列内の要素型は全く自由というわけではなく,各行ごとに決めておく必要がある.matrix というオブジェクトもあって,行列積とかで動作が異なるが使わない方がいい.

普通のオブジェクトのようにオブジェクトそのものと,オブジェクトの内容のコピーとの区別には注意すること.同じメモリ上の要素を,異なるindexingで参照できるようにしたビューの概念もある(indexingを参照)

a * b などのかけ算は要素積で行列積にはならないことに注意.内積も行列積も dot(a,b)

''生成方法'':基本は以下のとおり
 np.array([2, 3, 4]) … 1次元配列
 np.array([[3, 4], [8, 10]]) … 2次元配列
ここではリストからの変換だったが,タプルからの変換もできる.
配列の型は次のように指定
 np.array([2,3,4], dtype=int)

''ndarrayの属性'':
- ndarray.shape:配列の各次元の大きさをタプルで返す
- ndarray.ndim:配列の次元数
- ndarray.dtype:配列の要素の型.型を変えるときは親クラスへのアップキャストのみ.ダウンキャストには astype メソッドを使うこと

''ndarrayのメソッド'':
- ndarray.tolist, ndarrray.tostring:リストや文字列への変換
- ndarray.copy:配列のオブジェクトのコピー
- ndarray.tofile, ndarray.dump:バイナリ,テキスト,pickle 形式でファイルに書き出し
- ndarray.astype:やはり主なものint(a) などとしても int型の要素の配列にはならないので,a = a.astype(int) のようにする.

その他にも,argmax などの関数は a.argmax などのメソッドとして使えるものも多数ある.

*** スカラー と データ型オブジェクト (dtype) [#w44c17e2]
-[[Scalars>http://docs.scipy.org/doc/numpy/reference/arrays.scalars.html]]
-[[Data type objects (dtype)>http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html]]

python にある int や float に該当するスカラーの型.ndarray 配列の要素の型にできる.

bool_,int_,float_,complex_ が主な型だが,python標準の int や float でもまあ困らない.違いは float とかだとbit数がシステム依存だったりするが,float_ だと64bit指定.型はbit数なども細かく指定できるので,メモリが逼迫していたら指定するとよい.

配列の要素がスカラー型だとオブジェクトを代入できない.そんなときは配列を作るときに dtype=object_ としておくこと

*** インデキシングIndexing [#l9d00f8f]
- [[Indexing>http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html]]

''値の参照と代入'':次元ごとに "," で区切って要素を指定.
 >>> a
 array([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
 >>> a[1, 2]
 6
逆に代入もできる
 >>> a[2, 1] = -1
 >>> a
 array([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8, -1, 10, 11]])
添え字に負数を指定すると最後からの指定になる
 >>> a[-1, -2]
 10
1次元配列の 0, 3, 4 番目を参照しようとして "," で区切るとうまくいかないのでリストにする
 >>> b
 array([ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
 >>> b[[0,3,4]]
 array([2, 5, 6])
a の 0,2行と,0,3列 で構成される 2×2 行列を作ろうとして次のようにすると
 >>> a[[0,2],[0,3]]
 array([ 0, 11])
要素 [0,0] と [2,3] の指定になってしまう.こんなときは ix_ を使うと
 >>> a[np.ix_([0,2],[0,3])]
 array([[ 0,  3],
        [ 8, 11]])
bool値での指定もできる(リストのままだと True=1, False=0 と解釈されるので配列にすること)
 >>> a[np.array([False, True, True, False]), :]
 array([[[ 4,  5,  6,  7],
         [ 8, -1, 10, 11]]])
":" を使うとその次元の全ての要素になる.
 >>> a[1, :]
 array([4, 5, 6, 7])
もちろん行や列ごとの代入もできる.
連続した要素は普通のシーケンスと同様に参照できる(シーケンスと同様に 1:3 の終わりは一つ少ない 1〜2 の意味であることに注意)
 >>> a[:, 1:3]
 array([[ 1,  2],
        [ 5,  6],
        [-1, 10]])
シーケンスと同様に増分も指定できる.
 >>> b[1::3]
 array([3, 6, 9])
増分に負数を指定すると順序が逆転する
 >>> a[:, ::-1]
 array([[ 3,  2,  1,  0],
        [ 7,  6,  5,  4],
        [11, 10, -1,  8]])
次元数を増やしたいときは newaxis を使う
 >>> b[np.newaxis, :]
 array([[ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11]])
 >>> b[:, np.newaxis]
 array([[ 2],
        [ 3],
        [ 4],
        [ 5],
        [ 6],
        [ 7],
        [ 8],
        [ 9],
        [10],
        [11]])
3次元以上の配列で複数の次元の ":" をまとめて指定するには "..."(Ellipsisオブジェクト)を使う.
 >>> c
 array([[[10, 11],
         [12, 13]],
 
        [[14, 15],
         [16, 17]]])
 >>> c[..., 1]
 array([[11, 13],
        [15, 17]])

''ビュー'':同じメモリ領域に対し,異なる indexing で参照できる.同じメモリ領域なので,一方の内容を変更すると,もう一つのビューでの値も変わることに注意.
 >>> a
 array([[1, 2, 3],
        [4, 5, 6]])
 >>> b = a[:, 1:3]
 >>> b
 array([[2, 3],
        [5, 6]])
 >>> a[1,2] = -1
 >>> b
 array([[ 2,  3],
        [ 5, -1]])
違う配列にしたいときは copy メソッドを使う
 >>> c = a[:, 0:2].copy()
 >>> c
 array([[1, 2],
        [4, 5]])
 >>> a[0,0]=-10
 >>> c
 array([[1, 2],
        [4, 5]])

*** 配列クラスの下位クラス [#lbc181f8]
- [[Standard array subclasses>http://docs.scipy.org/doc/numpy/reference/arrays.classes.html]]
- [[Masked arrays>http://docs.scipy.org/doc/numpy/reference/maskedarray.html]]

- matrix:繰り返す Matrix オブジェクトのことは忘れよう
- memmap:メモリ上ではなく,ファイル上に配列を確保
- rec:列を数値ではなくラベルで参照できる.あとは普通に ndarray として使える
- ma:データ本体に加え,その要素が有効かどうかを示すマスクがある

''イテレータ'':ndarray をイテレータとして使うと,a.ndim より一つ次元の小さな部分配列を順次参照することになる.ndenumarate を使うと,全ての要素を順次参照できるタプルを返すイテレータ.要素の内容を順次参照したければ1次元配列のビュー a.flat などを使う.

** Numpy: Universal functions (ufunc) [#fb691948]
- [[Universal functions (ufunc)>http://docs.scipy.org/doc/numpy/reference/ufuncs.html]]

''broadcasting'':"*" や "+" など配列の要素間で2項を演算するときに,二つ配列の要素の対応付けを行う規則.対応付けができる条件は以下のいずれかの場合
+ 配列の shape が完全に一致
+ 次元数が一致し,各次元で大きさが一致するか,大きさが1
+ 次元数が少ない方の次元の前に大きさ1の次元を加えると上記の条件を満たすようになる

最後の条件は一方がスカラーの場合以外はあまり使わない方が安全
 >>> a
 array([[1, 2],
        [3, 4]])
 >>> a * 3
 array([[ 3,  6],
        [ 9, 12]])
2番目の条件を満たすように,明示的に newaxis を入れる方が安全
 >>> b
 array([10, 20])
 >>> a * b[np.newaxis, :]
 array([[10, 40],
        [30, 80]])
 >>> a * b[:,np.newaxis]
 array([[10, 20],
        [60, 80]])

''エラー処理''
- seterr:0除算,オバーフロー,アンダーフロー,不正入力など数値計算のエラーでWarningを表示したり,無視したり,例外を出したりという設定をする.

''キャスト規則'':型のキャストルール
- can_cast:二つの型の間でキャストできるかどうか

** [[NumPy: Routines>http://docs.scipy.org/doc/numpy/reference/routines.html]] [#d3a02f88]

*** 配列の生成 [#z4af47d8]
-[[Array creation routines>http://docs.scipy.org/doc/numpy/reference/routines.array-creation.html]]

''基本生成''
- empty, eye, ones, zeros:初期化なし,単位行列,1配列,0配列で新規生成
- empty_like, ones_like, zeros_like:与えた配列と同じ大きさのものを作る
- (repeat:指定した同じ要素で埋める)

''既存データからの作成''
- asarray:リストとかを ndarray オブジェクトに変換
- frombuffer:下位のデータ構造から生成.[[うまく使うと速いらしい>http://stackoverflow.com/questions/5674960/efficient-python-array-to-numpy-array-conversion]]
- fromfunction, fromiter, fromstring:関数出力,イテレータ,文字列から作る.ちょっとこった初期化をするとき
- loadtxt:CSV や スペース 区切りのファイルからの読み込み.テキスト形式のデータ読み込みでは一番便利.

''範囲''
- arange:python の range の ndarrayオブジェクト版
- linspace,logspace:等間隔,対数間隔の数列を得る.グラフでプロットするとき横軸を作ったりとか.
- meshgrid:縦横に等間隔な格子状の配列を作る

''行列生成''
- diag:対角行列
- tri, tril, triu:三角行列

*** 配列の操作 [#a41baf75]
- [[Array manipulation routines>http://docs.scipy.org/doc/numpy/reference/routines.array-manipulation.html]]

''形状変換''
- reshape:バッファ全体の大きさはそのままで形状を変更する.ndarray.reshape メソッドもある.shapeの要素を一つだけ -1 にするとデータの大きさに合わせて適切な値に自動設定される.
- 1次元の配列に要素を並べ替えたビューやコピー
-- ravel:どの軸を優先で並べるか指定できる.指定によってビューかコピーかが決まる
-- flat:現在の格納順で1次元の配列に並び替えたビュー
-- ndarray.flatten:ndarray.flat と同じだが,コピーを返す

''転置''
- ndarray.T:2次元以上の行列の転置ビューを返すメソッド.1次元ベクトルでは効かないので a[np.newaxis, :] などとする.
- transpose:転置だが,a.T と違って,転置する次元を指定できる.メソッドもある
- swapaxes:軸を交換したビュー.メソッドもある

''次元数の変換''
- at_least1d, at_least2d, at_least3d:それぞれ最低1次元,2次元,3次元以上の配列にする.関数で1次元か2次元か分からない引数が渡されたとき2次元以上に揃えたりするのに便利.
- squeeze:大きさが1の次元を全部除去した配列を返す
- newaxis:横ベクトル a を縦ベクトル a[np.newaxis, :] にしたり,横のまま2次元にしたり a[:, np.newaxis] とよく使う.

''結合・連結''
- concatinate:指定した軸で結合
- dstack:第3軸の結合
- hstatck, vstack:第1軸,第2軸の結合だが r_[] や c_[] の記法を使う方が便利

''分割''
- split, array_aplit:指定した軸で分割
- hsplit, vsplit, dsplit:第1〜3軸で分割

''タイル''
- tile:部分行列の繰り返し行列
- repeat:同じ要素で構成される行列.行ベクトルごとに一様分布な行列 np.repeat(1 / m, (n, m)) みたいに初期化で活躍.

''要素の追加・削除''
- delete, insert:部分行列の削除・挿入
- resize:全体のバッファの大きさの変更.メソッドもある.
- unique:行列中にある要素を含む配列を返す.100クラスあるけど,データの中に含まれているのは疎なとき,unique(y) とかすると,実際に存在する値だけが分かり,メモリも時間も節約できる.

''要素の再配置''
- fliplr, flipud:左右・上下の反転.というか a[:, ::-1] とか a[::-1, :] とかで足りると思う.
- reshape:行列の形状の変更.メソッドもある.非常によく使う.

*** インデキシング [#y49d3b52]
- [[Indexing routines>http://docs.scipy.org/doc/numpy/reference/routines.indexing.html]]

''インデックスの配列の生成''
- c_[], r_[]:列方向や行方向への結合.vstack や hstack より便利だと思う.1次元のベクトルは c_ では自動的に縦に変換してくれる.例えば,定数項に相当する 1 を特徴ベクトルに加えるときは
 >>> a
 array([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
 >>> c_[np.ones(a.shape[0]), a]
 array([[  1.,   0.,   1.,   2.,   3.],
        [  1.,   4.,   5.,   6.,   7.],
        [  1.,   8.,   9.,  10.,  11.]])
- ix_:要素をリストで [[1,1], [3,3]] と指定すると a[1, 1] と a[3, 3] の二つの指定になるが,a[np.ix_([1,1], [3,3])] とすると,a[1, 1], a[1, 3], a[3, 1], a[3, 3] の四つの要素を含む 2×2 の配列が得られる
- nonzero(a):非0要素のindexを返す.
 nz = np.nonzero(a)
 a[nz] += a[nz] **2
みたいにすると疎行列では効率的になる.メソッドもある.ちなみに次のように for を使うと遅い
 for ix in np.nonzero(a):
     a[ix] += a[ix] **2
- where:where(a > 5) とかだと,a の要素が 5より大きな要素のindexを返す.3項演算子みたいにも使えて,np.where(a > 0, a, 0) とかするとヒンジ関数みたいになる.
- indices:全要素のindex
-- その他対角要素や,上下の三角行列の要素とかもある

''要素を選択して操作''
- choose:where は bool 値だが,choose は3択以上でも配列から選択できる
- diag:対角要素の取り出し,多次元のなかから2次元分の対角要素は diagonal
- select:where で条件が複数書ける

''配列へのデータの代入''
- put:indexの大きさが合っていれば普通の代入と同じだが,合っていないときのエラーハンドリングが違う
- putmask:条件を満たしたところだけ代入
- fill_diagonal:対角要素への代入

''イテレータ''
- ndenumarate:引数配列の要素を順番に参照するイテレータ
- ndindex:ndenumerateと違って,配列そのものではなく,形状で指定
- nditer:いっぱい複雑な機能のあるイテレータ

*** データ型の操作 [#k881785c]
- [[Data type routines>http://docs.scipy.org/doc/numpy/reference/routines.dtype.html]]

dtype型の操作をする.普通に数値計算してるときはあまりお世話になることはないと思う.

- finfo, iinfo:浮動小数点や整数の最大・最小値などの情報.オブジェクトで返ってくるので,メンバー変数は次のようにしてチェック
 print np.finfo(np.float32)
 print np.iinfo(np.uint8)

*** 入出力 [#yeaa9371]
- [[Input and output>http://docs.scipy.org/doc/numpy/reference/routines.io.html]]

''NPY/NPZ形式''
- load, save, savez:npy, npz の専用形式でのファイル入出力

''テキスト形式''
- loadtxt, savetxt:それほど大きくなければ,TSV/CSV も読めるので便利
- genfromtxt:欠損値の扱いが特殊な場合
- fromregx:各行のフォーマットを正規表現で書いて,正規表現内のグループを値として配列に読み込める強力な関数.
- fromstring:文字列から1次元の配列を作る.文字列の split メソッドでリストではなく配列を返す関数と思えばよい.

''文字列フォーマット''
- array_str, array_repr:print で使うような形式の文字列への変換

''memmapファイル''
- memmap:配列をメモリではなく,ファイル上に確保.大きな配列を扱うとき.

''テキストのprint形式オプション''
- set_printoptions, get_printoptions:プリントのオプションの設定・読み出し

*** 線形代数 [#be513bc7]
- [[Linear algebra (numpy.linalg)>http://docs.scipy.org/doc/numpy/reference/routines.linalg.html]]

''行列・ベクトルの積''
- dot:内積・行列積の基本.ちょっと細かい点で動作の違う vdot や inner もある
- outer:外積
- tensordot:テンソルドット積
- kron:クロネッカー積
- linalg:matrix_power:行列の指数

''分解''
- linalg.{cholesky, qr, svd}:コレスキー,QR,特異値分解

''固有値・固有ベクトル''
- linalg.eig:固有値と固有ベクトルの計算.他にもいくつか関連するルーチンがある.

''ノルムなど''
- linalg.norm:Lnノルム
- linalg.cond:条件数
- linalg.det, linalg.slogdet:行列式,行列式の自然対数
- trace:トレース

''線形方程式の解と逆行列''
- linalg.solve, linalg.tensorsolve:線形方程式,テンソル方程式の解
- linalg.lstsq:最小2乗解,すなわち線形回帰
- linalg.inv, linalg.pinv, linalg.tensorinv:逆行列,擬逆行列,逆テンソル

''例外''
- linalg.LinAlgError:線形代数関連のpython例外

*** 乱数生成 [#c08965c1]

- [[Random sampling (numpy.random)>http://docs.scipy.org/doc/numpy/reference/routines.random.html]]

乱数生成には python標準の random もある.こちらの random は高度なアルゴリズムを使っていて偏りが少なくなっているので,数値計算ではかならず np.random を使うべき.

乱数生成だけなので,確率密度関数や分位点が必要なときは scipy の sp.stats を使う.

再現性のある実験やテストをしたいときには,np.random.seed で乱数のシードを固定するとよい.

たいていの分布はあるのだが,Bernoulli分布 がなくて困ることがある.そのときは,2項分布・多項分布の np.binomial, np.multinomial で試行数を 1 に設定する.
 np.random.binomial(1, p, size=100)
Pr[x=1 | y] を長さ 2 の配列 p[y] に入れているとする.y の実現値が配列 y = np.array([0, 1, 0, 0,..., 1]) のように入っているとき,Pr[x | y] に従う乱数を y 中のそれぞれの値について得るには次のようにする.for yi in y: などとすると遅い.
 np.random.binomial(1, p[y])

''順列''
- shuffle:配列の内容の位置をランダムに入れ替え
- permutation:多次元配列のときは,第1軸の方向だけでランダム入れ替え

*** ソート,検索,計数 [#j6797488]
[[Sorting, searching, and counting>http://docs.scipy.org/doc/numpy/reference/routines.sort.html]]

''ソート''
- sort:リストのソートを配列にしたもの.メソッドもある.
- argsort:ソートした内容ではなく,index を返す
- lexsort, msort, sort_comprex なども

探索
- argmax, argmin:最大・最小値になるindexを返す.
- nanargmax, argmin:NaN を無視するargmax, argmin
- nonzero, argwhere:非ゼロ要素を返すことになっているが,bool で True も非0なので,事実上条件に合致する要素の index の配列を返す関数.二つの関数の違いは返り値が転置になっている.
- where:条件を満たす要素を返す.choose のような代入もできる.

''計数''
- count_nonzero:非ゼロ要素の数を返す

*** 論理関数 [#q0f5fdb7]
- [[Logic functions>http://docs.scipy.org/doc/numpy/reference/routines.logic.html]]

''真理値のテスト''
- all:全称限量子.配列の要素が全て真のとき真を返す.
- any:存在限量子.配列の要素が一つでも真のとき真を返す.

''配列の内容チェック''
- isfinite, isinf, isnan, isneginf, isposinf:有限,無限,不定値,負の無限,正の無限かを検査

''行列の型チェック''
- 複素数やスカラーなど配列の型をチェック

''論理演算''
- logical_and, logical_or, logical_not, logical_xor:普通の and などは配列に適用できないが,numpy のこれらの演算は可能

''比較''
- allclose:数値演算ではうまく等価にならない場合もあるので,ある許容範囲にあるかどうかを調べる.
- array_equal, array_equiv, greater, greater_equal, less, less_equal, equal, not_equal:配列の要素ごとの比較演算

*** 二値演算 [#fbab4456]
- [[Binary operations>http://docs.scipy.org/doc/numpy/reference/routines.bitwise.html]]

''要素ごとのビット演算''
- bitwise_and, bitwise_or, bitwise_xor, invert:ビット論理演算
- left_shift, right_shift:ビットシフト

''ビットのパック''
- packbits, unpackbits:0/1 値の配列を uint8型 の配列に変換・逆変換

*** 統計 [#oad250d3]
- [[Statistics>http://docs.scipy.org/doc/numpy/reference/routines.statistics.html]]

分布の統計量などは sp.stats を参照のこと.

''極値''
- amax, amin, ptp:軸にそった最大値,最小値,(最大 - 最小)
- nanmax, nanmin:不定値を除いた最大値,最小値.高速な bottleneck パッケージなども参考に.

''平均と分散''
- mean:算術平均
- average:重み付きが可能な平均
- median:中央値
- std:標準偏差
- var:分散

''相関''
- corrcoef:相関係数
- cov:共分散行列

''ヒストグラム''
- histogram, histogram2d, histogramdd:1次元,2次元,3次元のヒストグラム.1…k の整数で表した長さ n の多値変数 x と y の同時分布は
 pxy = np.histogram2d(x, y, bins=(k, k), range=((0, k), (0, k)))[0]
 pxy = pxy / np.sum(pxy)
- bincount:histogram と同様の使い方ができる
- digitize:指定したビンで離散値に変換する

*** 数学関数 [#x88c5a1a]
- [[Mathematical functions>http://docs.scipy.org/doc/numpy/reference/routines.math.html]]

digamma や erf などもっと高度な数学関数は sp.special を参照のこと

''三角関数''
- sin, cos, tan, arcsin, arccos, arctan, arctan2:mathパッケージとは違い,配列の要素ごとに適用できる.複素数は np.emath を使うこと
- degrees, radians, deg2rad, rad2deg:ラジアンと度の相互変換
- unwrap:ラジアンを -2π〜2π に収まるまで 2π を引く

''双曲線関数''
- sinh, cosh, tanh, arcsinh, arccosh, arctanh:mathパッケージとは違い,配列の要素ごとに適用できる.複素数は np.emath を使うこと

''まるめ''
- around, rint:普通のまるめ
- floor:入力値以下の最大整数
- ceil:入力値以上の最小整数
- fix:0に近い方の整数
- trunc:少数部分の削除

''和・積・差''
- prod, sum:和や積.軸を指定できる.x と y の頻度が入った配列 n[x, y] があるとき条件付き確率 Pr[x | y] は
 >>> n
 array([[ 2.,  3.],
        [ 4.,  2.]])
 >>> n / np.sum(n, axis=1)[:, np.newaxis]
 array([[ 0.4       ,  0.6       ],
        [ 0.66666667,  0.33333333]])
- cumprod, cumsum:累積積,累積和
- nansum:不定値以外の和.bottleneck もパッケージを参照.
- diff, ediff1d, gradient:配列間の差や勾配
- cross:クロス積
- trapez;台形則での数値積分

''指数・対数関数''
- exp, expm1, exp2:配列処理対応の exp, exp(x) - 1, 2^x
- log, log10, log2, log1p:自然対数,常用対数,底が2の対数,log(1 + x)
- logaddexp, logaddexp2:exp(sum(log))

''その他の数学関数''
- i0:第1種,次数0のBessel関数.他のBessel関数は sp.special を参照.
- sinc:sin(πx) /(πx)

''浮動小数点''
- signbit:0以上なら真
- copysign:符号のコピー
- frexp, ldexp:指数表現部分と数値部分の分離統合

''四則演算''
- add, subtract, multiply, divide, negative:要素ごとの四則演算
- reciprocal, power:逆数,累乗
- true_division, floor_division:整数同士の除算.実数を返すか,floorした整数を返すか
- fmod, mod, reminder:モジュロ演算だが負数の扱いとかが微妙に違う.python の % と同じなのは fmod
- modf:少数部分と整数部分に分ける

''複素数''
- real, imag:実数と虚数部分
- angle:角
- coonj:複素共役

''その他''
- convolve:たたみ込み
- clip:指定した区間に納める
- sqrt, square:正実数だけの平方根と複素数にも対応した平方根
- fabs, absolute:実数用と複素数用の絶対値
- sign:負,0,正のとき -1, 0, +1
- maximum, minimum:要素を比較して大きい方・小さい方を返す
- interp:線形補間

*** 関数プログラミング [#w5f341b1]
- [[Functional programming>http://docs.scipy.org/doc/numpy/reference/routines.functional.html]]

- apply_along_axis:関数を要素の軸に沿って適用する.特徴数 nf で,事例数 n のデータが shape(n, nf) の配列 x と,長さ nf の重み行列 w があるとする.x の各事例と重み w の内積のシグモイドを求める関数 sigmoid があるとする.全ての事例について sigmoid を適用するには
 apply_along_axis(sigmoid, 1, x, w)
関数の返す次元が100ぐらいまでは,リスト内包表記,それ以降は np.apply_along_axis がよいようだ
 [sigmoid(x[i, :], w) for i in xrange(x.shape[0])]
- apply_over_axes:複数の軸に渡って関数を定義する.頻度を格納した度数 n[x, y, z] があるとき,y と z で周辺化した x の周辺確率は
 apply_over_axes(np.sum, n, [1, 2]) / np.sum(n)
- vectorize:スカラー用の関数があるとき,それをベクトル対応にした関数を定義するための関数
 print numpy.vectorize(lambda x: x*2)(numpy.arange(1, 3)) #=> [2 4]
- frompyfunc:pythonの関数をベクトル対応に
- piecewise:select と似ているが,値の選択だけでなく,関数の適用ができる

*** 多項式 [#w74498d6]
- [[Polynomials>http://docs.scipy.org/doc/numpy/reference/routines.polynomials.html]]

Polynomial, Legendre などいくつかの級数展開した式のクラスがあり評価や当てはめができる.多項式は特に以下のような簡易な関数がある.

- poly1d:C_n x^n + C_{n-1}x^{n-1} +…+ C_1 x + C_0 や (x - C_n) (x - C_{n-1}) … (x - C_1) の形式の多項式を定義
- polyval:定義した多項式を評価
- poly:指定した根をもつ多項式の係数の列
- roots:多項式の根
- polyfit:多項式へのあてはめ
- polyder:導関数
- polyint:不定積分
- polyadd, polysub, polymul, polydiv:四則演算

*** 集合関数 [#sf1a8248]

- [[Set routines>http://docs.scipy.org/doc/numpy/reference/routines.set.html]]

- unique:配列中に存在する値の配列を返す.疎な値しか取らない場合にはうまく使うとメモリの節約になる.
- intersect1d, union1d, setxor1d, setdiff1d:積集合,和集合,排他的論理和の集合,差集合
- in1d:最初の集合に含まれる各要素について,2番目の集合に含まれるかどうかを真理値で返す

*** numpy専用ヘルプ関数 [#b3574da1]

- [[Numpy-specific help functions>http://docs.scipy.org/doc/numpy/reference/routines.help.html]]

- lookfor:関数のdocstringの検索
- info:関数,クラス,モジュールの説明
- source:ソースの表示

*** その他のルーチン [#n1ed4411]


''離散フーリエ変換''
- [[Discrete Fourier Transform (numpy.fft)>http://docs.scipy.org/doc/numpy/reference/routines.fft.html]]

libfft を呼び出す離散フーリエ変換の関数群.scipy があれば,そちらのルーチンが自動的に利用される.

''日時処理関数''
- [[Datetime Support Functions>http://docs.scipy.org/doc/numpy/reference/routines.datetime.html]]

営業日かどうかを調べる

''金融関数''
- [[Financial functions>http://docs.scipy.org/doc/numpy/reference/routines.financial.html]]

金利関連計算

''窓関数''

- [[Window functions>http://docs.scipy.org/doc/numpy/reference/routines.window.html]]

関数や系列に掛け合わせる窓関数

''浮動小数点エラー処理''
- [[Floating point error handling>http://docs.scipy.org/doc/numpy/reference/routines.err.html]]

オーバーフローなどの数値演算上のエラーがあるとき例外にするか何もしないかなどを決める seterr など

''マスク付き配列''

- [[Masked array operations>http://docs.scipy.org/doc/numpy/reference/routines.ma.html]]

通常の配列用の関数をマスク付き配列用にしたもの.マスクの操作なども.

''雑多な関数''

- [[Miscellaneous routines>http://docs.scipy.org/doc/numpy/reference/routines.other.html]]

メモリ領域(バッファ)の確保など

''テスト用''
- [[Test Support (numpy.testing)>http://docs.scipy.org/doc/numpy/reference/routines.testing.html]]

unittest や doctest などを書くときに使う関数

''自動型適応する数学関数''
- [[Mathematical functions with automatic domain (numpy.emath)>http://docs.scipy.org/doc/numpy/reference/routines.emath.html]]

複素数を使うときに型変換が通常のものと異なる数学関数

''scipyで高速化されうる関数''
- [[Optionally Scipy-accelerated routines (numpy.dual)>http://docs.scipy.org/doc/numpy/reference/routines.dual.html]]

固有値・逆行列,フーリエ変換,Bessel関数の i0 などは scipy のものの方が高速だったりする.scipy がインストールされればそちらが使われる.

''文字列操作''
- [[String operations>http://docs.scipy.org/doc/numpy/reference/routines.char.html]]

通常の文字列処理関数をベクトル処理できるように拡張

** [[SciPy>http://docs.scipy.org/doc/scipy/reference/]] [#ae933c86]

''クラスタリング''
- [[Clustering package (scipy.cluster)>http://docs.scipy.org/doc/scipy/reference/cluster.html]]

k-means法 の sp.cluster.vq と凝集型階層的クラスタリングの sp.cluster.hierarchy とがある

''定数''
- [[Constants (scipy.constants)>http://docs.scipy.org/doc/scipy/reference/constants.html]]

黄金比,光速,重力定数,アボガドロ数など様々な定数

''フーリエ変換''
- [[Fourier transforms (scipy.fftpack)>http://docs.scipy.org/doc/scipy/reference/fftpack.html]]

scipy があれば,numpy のものを呼び出してもこちらが使われる.

''数値積分''
- [[Integration and ODEs (scipy.integrate)>http://docs.scipy.org/doc/scipy/reference/integrate.html]]

関数や数列から数値積分を行う.

''補間''
- [[Interpolation (scipy.interpolate)>http://docs.scipy.org/doc/scipy/reference/interpolate.html]]

numpy は interp は線形1次だけだが,多次元や,多項式・スプライン補間もある

''入出力''
- [[Input and output (scipy.io)>http://docs.scipy.org/doc/scipy/reference/io.html]]

matlab, matrix market, wav, arff, netcdf の入出力

''線形代数''
- [[Linear algebra (scipy.linalg)>http://docs.scipy.org/doc/scipy/reference/linalg.html]]

numpyより関数の種類は増えている.scipy があれば,numpy のものを呼び出してもこちらが使われる.

''その他の関数''
- [[Miscellaneous routines (scipy.misc)>http://docs.scipy.org/doc/scipy/reference/misc.html]]

''n次導関数,階乗など''
- [[Multi-dimensional image processing (scipy.ndimage)>http://docs.scipy.org/doc/scipy/reference/ndimage.html]]

画像処理.フィルタ処理など簡単なもの.より高度なものは opencv のラッパ関数など使うべき.

''直交距離回帰''
- [[Orthogonal distance regression (scipy.odr)>http://docs.scipy.org/doc/scipy/reference/odr.html]]

説明変数が独立でない場合の回帰

''最適化と求根''
- [[Optimization and root finding (scipy.optimize)>http://docs.scipy.org/doc/scipy/reference/optimize.html]]

最適化関数群だが,共役勾配法やニュートン法など基本的なものだけ.より高度な数値計画法は openopt,cvxopt,scikits.optimization パッケージを参照.

''信号処理''
- [[Signal processing (scipy.signal)>http://docs.scipy.org/doc/scipy/reference/signal.html]]

たたみ込み,Bスプライン,ウェーブレット,各種フィルタ処理.

''疎行列''
- [[Sparse matrices (scipy.sparse)>http://docs.scipy.org/doc/scipy/reference/sparse.html]]
- [[Sparse linear algebra (scipy.sparse.linalg)>http://docs.scipy.org/doc/scipy/reference/sparse.linalg.html]]

ほとんどの要素が 0 の疎行列を処理する.あまりよくないとも聞くので Pysparse などのパッケージの方がよいかも.

''空間アルゴリズムとデータ構造''
- [[Spatial algorithms and data structures (scipy.spatial)>http://docs.scipy.org/doc/scipy/reference/spatial.html]]

近傍点の検索を高速化する kd-木 や,Delaunay三角形分割など

''距離計算''
- [[Distance computations (scipy.spatial.distance)>http://docs.scipy.org/doc/scipy/reference/spatial.distance.html]]

ベクトル間の距離だけでなく,距離行列をまとめて計算できたりする.

''特殊関数''
- [[Special functions (scipy.special)>http://docs.scipy.org/doc/scipy/reference/special.html]]

numpy は初等関数だけだが,こちらは Bessel関数,ガンマ関数,誤差関数 (erf関数),Legendre関数の他,聞いたこともない関数がいろいろ.

- ディガンマ関数は psi 関数という名前になってる

''統計関数''
- [[Statistical functions (scipy.stats)>http://docs.scipy.org/doc/scipy/reference/stats.html]]

numpy は乱数生成だけだが,様々な確率分布の密度関数,分位点,モーメントなどを得ることができる.


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS