ndarray – 整数の乱数配列を作る

重複しない乱数配列

0~n−1の整数を重複なくランダムに並べた配列。arange()で数列を作り、それをnumpy.randomモジュールのshuffle()permutation()でシャッフルする。shuffle()は元の配列を書き換え、permutation()は元の配列を書き換えずにシャッフル後の新たな配列を返す。permutation(n)で整数を指定すると、0 ~n-1がランダムに並んだ配列を返す。

“permutation”は置換の意味で、配列中の2要素を何回かランダムに置換していくイメージ(同じ単語が順列の意味でも使われる)。

m~n−1の乱数配列は、arange(m, n)をシャッフル。

重複を許す乱数配列

0~m−1の範囲で重複を許してn個の要素を持つ配列を生成する方法。

簡単なのはnumpy.randomchoice()でサイズを指定する方法。

m~n−1の範囲の乱数配列は、arange(m, n)choice()を使う。

 

numpy.varやnumpy.stdの自由度

numpy.varnumpy.stdは、それぞれ配列で与えたデータの分散、標準偏差を返す。

numpy.var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>)

numpy.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False)

この関数の引数にddofというのがあり、numpyのドキュメントには以下のように書かれている。

ddof : int, optional
Means Delta Degrees of Freedom. The divisor used in calculations is N – ddof, where N represents the number of elements. By default ddof is zero.

つまり、分散の計算の際にN−ddofで割っていて、デフォルトではddof=0なので、母分散及び母集団の標準偏差として計算される。

ddof=1とすると不偏分散およびその平方根として計算される。

 

ただし正確には、不偏分散の平方根は母集団の標準偏差の不偏推定量ではないらしい。

 

ndarray.reshape()の使い方

reshape()の考え方

a.reshape(d1, ..., dn)として変形する場合

  • n次元の配列になる
  • d1 + ... + dn = a.sizeでなければならない

要素が1つの場合

ndarrayの引数に1つの数値を指定するとndarrayクラスだが数値のように表示される。

これをreshape(1)とすると、1要素の1次元配列になる。

reshape(1, 1)とすると、1要素の2次元配列になる。reshape(1, 1, 1)なら3次元配列。

2次元化、3次元化された配列をreshape(1)とすると、1要素の1次元配列になる。

1次元配列の変形

2次元1行の配列への変形

1次元配列をreshape(1, -1)とすると、その配列を要素とする2次元1行の配列になる。

2次元1列の配列への変形

1次元配列をreshape(-1, 1)とすると、その配列を要素とする2次元1列の配列となる。

任意の次元の配列への変形

1次元配列をreshape(m, n)とすると、m行n列の2次元配列になる。m×nが配列のサイズと等しくないとエラーになる(いずれかを−1として自動設定させることは可能)。

3次元以上の配列へも変形可能。

1次元配列への変換

任意の形状の配列aについてreshape(a.size)とすることで、1次元の配列に変換できる。

 

ndarray – 行・列の抽出

例示用の配列

以下の配列を例示用に準備する。

単一の行・列の抽出

単一の行の抽出

単に1つ目のインデックスを指定すると、それに対応する行が抽出される。2つ目の引数を省略すると、全て':'を指定したことになる。

単一の列の抽出

1つ目の引数を':'とし、2つ目にインデックスを指定すると、対応する列が抽出される。ただし結果は1次元の配列となる。

これを列ベクトルとして取り出すのに2つの方法がある。

1つ目の方法はreshape(-1, 1)とする定石。2つ目の引数1は列数1を指定し、1つ目の引数を−1にすることで、列数とサイズから適切な行数が設定される。

2つ目の方法は、列数を指定するのに敢えて1列のスライスで指定する方法。後述するように、列をスライスで指定した場合は2次元の形状が保持されることを利用している。以下の例では、2列目から2列目までの「範囲」を指定している。

連続する複数の行・列の抽出

連続する複数行の抽出

1つ目の引数をスライスで指定して、連続する複数行を抽出。

連続する複数列の抽出

2つ目の引数をスライスで指定して、連続する複数列を抽出。

不連続な複数の行・列を抽出

不連続な複数の行を抽出

第1引数をリストで指定すると、その要素をインデックスとする複数の行が抽出される。このような指定方法のインデックスを、ファンシーインデックスと言う。

リストの要素は昇順である必要はなく、要素順に行が取り出される。

不連続な複数の列の抽出

1つ目の引数を':'とし、2つ目の引数をリストで指定して要素に対応する列を取り出せる。

列についても、要素の順番は任意。

 

ndarray.reshape – 配列の形状変更

基本

配列の形状変更は、reshape()メソッドで行う。reshape()メソッドは、元の配列を破壊せず新たな配列を生成する。

具体のいろいろな使い方は、ndarray.reshapeの使い方を参照

以下の例では6個の要素の1次元配列を2×3の2次元配列に変更し、それをさらに3 ×2の2次元配列に変更している。要素は常に行を上から、各行の列要素を左からネストした形で埋めていく。

暗黙指定

サイズ変更の際、ある次元の要素数を-1とすると、他の要素数に合わせて適切に設定してくれる。

以下の例では2×3×2の3次元配列をつくり、それを3×2×2に変形しているが、2次元目を-1として1次元目と3次元目から設定させている。

この方法は、たとえば行ベクトルの配列を列ベクトルに変換するときに使われる。以下の例では1次元の配列をつくり、それを列ベクトルとするのに、列数を1で固定し、行数を-1として算出させている。

1次元化するときの注意

多次元配列や列ベクトルを1次元化するとき、行数を1、列数を-1で暗黙指定すると求める1次元配列を1つだけ含む2次元の配列になる。こうなってしまのはreshape()の引数で1行×n列の2次元で指定したため。

そこで、size属性で1つの整数だけを指定すると、1次元でその要素数の配列になってくれる。

さらには、引数を-1のみで指定すると、配列のサイズを適当に持ってきて適用してくれる。

これは列ベクトルを行ベクトル化するときのほか、pyplotで複数のAxesインスタンスを行×列の形で受け取った時に、全てのインスタンスに同じ設定を適用したいときなどに1次元化してループで回す、といったようなことにも使える。

 

ndarray – 配列の次元・形状・サイズ

ndim属性~配列の次元

ndim属性は配列の次元を整数で返す。

1次元配列を1つだけ要素に持つ配列や列ベクトルの次元が2となっている点に注意。とにかく[]のネストの数だと考えればよい。

shape属性~配列の形状

shape属性は配列の形状を返す。

1次元1行の単純な配列のときにはshapeが(1, n)とならないのが気になるがこれは結果が常にタプルで返されるためで、1次元とわかっているときには1つの整数が返ってくると考えてよい。

ndim=2となる形状の場合にはタプルも2要素となって、shape=(行数, 列数)となる。より多次元の場合、外側の次元の要素数からの順番になる。

size属性~配列のサイズ

size属性で得られる配列のサイズは配列の要素数。

 

ndarray – 2次元配列の1次元化

概要

ndarrayの2次元配列を1次元化して扱いたいとき(たとえば2次元のAxes配列を一括で扱いたいとき)の方法に、reshape()メソッド/関数、flatten()メソッド、ravel()メソッド/関数を使う方法がある。

以下、次の配列を使う。

ndarrayのメソッド

ndarrayのメソッドのreshape()flatten()ravel()を使う。戻り値もndarray。

reshape()メソッド

reshape()メソッドで1次元化する場合、reshape(-1)とする。

1次元の列ベクトルが必要な場合はreshape(-1, 1)

reshape(1, -1)とすると1行になるが、次元が2次元であるため、1つの1次元要素配列を要素に持つ2次元配列となってしまう。

flatten()メソッド

flatten()メソッドは、reshape(-1)と同じ効果を持つ。

ravel()メソッド

ravel()メソッドも、reshape(-1)と同じ効果を持つ。

Numpyの関数

Numpy.reshape()関数、Numpy.ravel()関数は、引数にndarray以外のarray-likeオブジェクトをとることができる。ただし戻り値はndarray。

Numpy.flatten()は定義されていない。

numpy.reshape()関数

numpy.reshape()関数は、第2引数で次元・次数を与える。

2次元にしたい場合は、第2引数をタプルにする。

numpy.ravel()関数

numpy.ravel()関数の機能はravel()メソッドと同じ。

戻り値のビューとコピーの違い

reshape()ravel()は可能な限りビューを返す(結果の変更がオリジナルに影響を与える)。

flatten()はコピーを返す(結果の変更はオリジナルに影響しない)。

 

ndarray – 条件式による要素の取り出し

基本形

ndarrayの要素に以下のような条件式を指定すると、条件に適合した要素を取り出せる。

これは次のような仕組みになっている。

まず配列の要素として、要素数と同数の論理値(True/False)を格納した配列を指定すると、Trueに対応した要素のみを要素とする配列が返される。

一方、配列全体を条件式とすると、各要素について条件判定を行った結果(True/False)を要素とする配列が返される。

したがって、配列の要素に配列全体の条件式を適用すると、その条件判定がTrueとなる要素からなる配列が返される。

別配列の条件による取り出し

条件に合う行の取り出し

上記の応用で、以下のように配列aの要素を配列bの条件により取り出すことができる。

この方法は、元データからクラス分類に応じたデータのみを取り出すときなどに使える。

たとえば以下は、5組の座標値のセットXから、クラスyが1となる座標値のサブセットを取り出すイメージ。

条件に合う列の取り出し

条件に適合した列のみ取り出す場合には、少し工夫が必要で、内包表記と条件指定を組み合わせる。

以下の例では、配列yで抽出したい列を1としていて、内包表記で配列を取り出す際にこれを利用している。

 

numpy – meshgridの概要

格子の生成

3次元グラフの描画にも使われるnumpy.meshgrid()の動作の概要をまとめる。indexingsparseといった引数については、別の機会に。

x, yがとる範囲を与えると、全格子点の座標が生成される。xが列、yが行を表すカウンターとみると、その内容は以下のようになる。

y|x -2 -1 0 1 2
-1 (-2, -1) (-1, -1) (0, -1) (1, -1) (2, -1)
0 (-2, 0) (-1, 0) (0, 0) (1, 0) (2, 0)
1 (-2, 1) (-1, 1) (0, 1) (1, 1) (2, 1)

各格子点位置のx, yの値が各配列の要素に合っていることが確認できる。

格子点座標による演算

生成された格子座標に演算を施したり関数に適用すると、各格子点位置の値が計算される。

 

numpy – arange, linspace~数列の生成

numpy.arange()~間隔を指定した数列の生成

引数・戻り値

numpy.arange([start, ]stop, [step, ]dtype = None)

引数 概要
start int/float 数列の開始値。省略可(デフォルトは0)
stop int/float 数列の終了値。省略不可。
step int/float 数列の間隔。省略可(デフォルトは1)。
dtype dtype 生成される数列のデータ型。指定しない場合は引数の型が適用される。

戻り値:開始値startからstepずつ増加し、stop未満の数列のndarray

引数の指定例

必ず以下のように指定する。numpy.arange(stop=5, step=2)のような指定はできない。

numpy.arange(stop)
0以上stop未満で増分1の数列を返す。数列の型は引数の型による。
numpy.arange(start, stop)
start以上stop未満で増分1の数列を返す。数列の型は引数の型による。
numpy.arange(start, stop, step)
startから始まり、stepずつ増加/減少し、stepの手前までの数列を返す。数列の型は引数の型による。

その他

降順の数列

stepを負の値にして降順の指定も可能。この場合はstart≥n>endの範囲となる。

実数列

stepを指定して実数の列も作れる。

ただしデフォルトでstart=0(0.0)step=1(1.0)なので以下のような挙動になる。

dtypeによる型指定

dtypeで強制的に型を指定可能。

numpy.linspace()~個数を指定した数列の生成

引数・戻り値

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

引数 概要
start int/float 数列の開始値。省略不可。
stop int/float 数列の終了値。省略不可。
num int 数列の要素数。省略可(デフォルトは50)。
endpoint bool stopを要素に含むかどうかを指定。Trueで含み、Falseなら含まない。省略可(デフォルトはTruestopを含む)。
retstep bool 戻り値として配列に加えて公差を返すかどうかを指定。Trueで配列を第1要素、公差を第2要素とするタプルを返し、Falseなら配列のみを返す。
dtype dtype 生成される数列のデータ型。指定しない場合はfloatが適用される。

戻り値:startからstopまでをnum等分した数列のndarray

引数の指定例

numpy.linspace(start, stop)
startから始まりstopで終わる50個の数列を返す。
numpy.linspace(start, stop, num)
startから始まりstopで終わるnum個の数列を返す。
numpy.linspace(start, stop, num, endpoint=False)
startから始まりstopの手前で終わるnum個の数列を返す。

その他

dtypeによる型指定

dtype=intと指定して、整数列を生成できる。

ただし分割個数を適切に指定しないと、変な結果になる。

retstepを指定した公差の取り出し

retstep=Trueと指定すると、第1要素に数列のndarray、第2要素に公差を持つタプルが返される。