Numpyの乱数
Numpy には様々な乱数を発生させる関数が用意されています。
乱数を作成する時に、シードを指定すると何度実行しても同じ乱数が得られることになります。
seed()の引数の値は何を使ってもよいのですが、42という値を見ることがあります。
プログラム的には意味がありませんが、「生命、宇宙、そして万物についての究極の疑問の答え」に出てきたりする単なるお遊びです。
Numpyで作る乱数
データ型`dtype` | 型コード | 説明 |
---|---|---|
`int8` | `i1` | 符号あり8ビット整数(-128 ~ 127)型 |
`int16` | `i2` | 符号あり16ビット整数 (-32768 to 32767)型 |
`int32` | `i4` | 符号あり32ビット整数(-2147483648 to 2147483647)型 |
`int64` | `i8` | 符号あり64ビット整数 (-9223372036854775808 to 9223372036854775807)型 |
`uint8` | `u1` | 符号なし8ビット整数 (0 ~ 255)型 |
`uint16` | `u2` | 符号なし16ビット整数(0 ~ 65535)型 |
`uint32` | `u4` | 符号なし32ビット整数(0 ~ 4294967295)型 |
`uint64` | `u8` | 符号なし64ビット整数(0 ~ 18446744073709551615)型 |
`float16` | `f2` | 半精度浮動小数点型(符号部1ビット、指数部5ビット、仮数部10ビット) |
`float32` | `f4` | 単精度浮動小数点型(符号部1ビット、指数部8ビット、仮数部23ビット) |
`float64` | `f8` | 倍精度浮動小数点型(符号部1ビット、指数部11ビット、仮数部52ビット) |
`float128` | `f16` | 四倍精度浮動小数点型(符号部1ビット、指数部15ビット、仮数部112ビット) |
`complex64` | `c8` | 複素数(実部・虚部がそれぞれ`float32`) |
`complex128` | `c16` | 複素数(実部・虚部がそれぞれ`float64`) |
`complex256` | `c32` | 複素数(実部・虚部がそれぞれ`float128`) |
`bool` | `?` | ブール型(`True` or `False`) |
`unicode` | `U` | Unicode文字列 |
`object` | `O` | Pythonオブジェクト型 |
乱数を作成する関数のポイント
- rand()に引数を複数入れることで、配列の次元を増やせます
- rand()とrand_sample()は引数の指定が異なります。rand_sample()は引数はひとつで高次元の配列を作る場合はタプルを使います
- normal()の引数のlocは分布の平均「中心」を、scaleは分布の標準偏差を表します
seedを使うと何度実行しても同じランダムな値になります。
import numpy.random as random # seed作成 random.seed(42) # 正規分布の乱数 平均0、標準偏差1 rnd_data = random.randn(10) print(rnd_data) rnd_data.min()
結果
[ 0.497 -0.138 0.648 1.523 -0.234 -0.234 1.579 0.767 -0.469 0.543]
-0.469
5行3列のランダムな値を作成
# random.rand()で高次元の指定も可能 rnd_data12 = random.rand(10, 5, 3) print(rnd_data12)
結果は実際のコードで確認ください
[[[0.021 0.97 0.832]
[0.212 0.182 0.183]
[0.304 0.525 0.432]
[0.291 0.612 0.139]
[0.292 0.366 0.456]]
ーーーーー以下省略ーーーーーー
random_sample()の例
# random.rand()と同様に使えるが、タプルで高次元の指定も可能 rnd_data2 = random.random_sample(10) print(rnd_data2) rnd_data13 = random.random_sample((10,5)) print(rnd_data13)
結果
[0.368 0.632 0.634 0.536 0.09 0.835 0.321 0.187 0.041 0.591]
[[0.678 0.017 0.512 0.226 0.645]
[0.174 0.691 0.387 0.937 0.138]
[0.341 0.113 0.925 0.877 0.258]
[0.66 0.817 0.555 0.53 0.242]
[0.093 0.897 0.9 0.633 0.339]
[0.349 0.726 0.897 0.887 0.78 ]
[0.642 0.084 0.162 0.899 0.606]
[0.009 0.101 0.664 0.005 0.161]
[0.549 0.692 0.652 0.224 0.712]
[0.237 0.325 0.746 0.65 0.849]]
randint()の例
# randint()の第2引数は次元ではなく終わりの値、第3引数に個数を指定 rnd_data3 = random.randint(2,8,3) print(rnd_data3)
結果
[2 2 5]
ランダムな抽出
* 第1引数 元の配列
* 第2引数 抽出数
* 第3引数 オプション(重複指定)replace=False
random.choice()の例
# random.seed(42) data = np.array([9, 2, 3, 4, 10, 6, 7, 8, 1, 5]) print(random.choice(data,1)) print(random.choice(data,10)) #重複あり、復元抽出 print(random.choice(data,10,replace=False)) # 重複なし、非復元抽出
結果
[3]
[ 6 7 6 6 6 3 6 8 2 10]
[ 1 2 6 7 3 8 4 10 5 9]
普通のリストでも使える
# random.seed(42) data_p = [9, 2, 3, 4, 10, 6, 7, 8, 1, 5] print(random.choice(data_p,1))
結果
[9]
Numpyで行列作成
arange()関数について
np.arangeは、連番や等差数列を生成する関数です。
同様の関数としてlinspaceがありますが、指定できる要素が異なるのとarangeは1つだけ引数を設定するだけで手軽に数列を生成できる違いがあります。
params
データ型`dtype` | 型コード | 説明 |
---|---|---|
`int8` | `i1` | 符号あり8ビット整数(-128 ~ 127)型 |
`int16` | `i2` | 符号あり16ビット整数 (-32768 to 32767)型 |
`int32` | `i4` | 符号あり32ビット整数(-2147483648 to 2147483647)型 |
`int64` | `i8` | 符号あり64ビット整数 (-9223372036854775808 to 9223372036854775807)型 |
`uint8` | `u1` | 符号なし8ビット整数 (0 ~ 255)型 |
`uint16` | `u2` | 符号なし16ビット整数(0 ~ 65535)型 |
`uint32` | `u4` | 符号なし32ビット整数(0 ~ 4294967295)型 |
`uint64` | `u8` | 符号なし64ビット整数(0 ~ 18446744073709551615)型 |
`float16` | `f2` | 半精度浮動小数点型(符号部1ビット、指数部5ビット、仮数部10ビット) |
`float32` | `f4` | 単精度浮動小数点型(符号部1ビット、指数部8ビット、仮数部23ビット) |
`float64` | `f8` | 倍精度浮動小数点型(符号部1ビット、指数部11ビット、仮数部52ビット) |
`float128` | `f16` | 四倍精度浮動小数点型(符号部1ビット、指数部15ビット、仮数部112ビット) |
`complex64` | `c8` | 複素数(実部・虚部がそれぞれ`float32`) |
`complex128` | `c16` | 複素数(実部・虚部がそれぞれ`float64`) |
`complex256` | `c32` | 複素数(実部・虚部がそれぞれ`float128`) |
`bool` | `?` | ブール型(`True` or `False`) |
`unicode` | `U` | Unicode文字列 |
`object` | `O` | Pythonオブジェクト型 |
returns
指定された等差(初期値は1)を持つ等差数列を要素とするndarrayが返されます。
np.arange関数の例
np.arange(9)
結果
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
np.arange関数で詳細に引数を決めた場合の例
array0 = np.arange(3,12,2,dtype=np.float64) array0
結果
array([ 3., 5., 7., 9., 11.])
reshape()とshapeプロパティ
reshape()は行列の形を変えます。
shapeプロパティは行列の型を返します。
np.arange関数でベクトルを作成後にreshapeで行列に変換することは頻繁に行われます。
array1 = np.arange(6).reshape(2,3) array1
結果
array([[0, 1, 2],
[3, 4, 5]])
array1 = np.arange(6) array1.reshape(3,2)
結果
array([[0, 1],
[2, 3],
[4, 5]])
a = np.array([[0, 1], [2, 3], [4, 5]]) a.shape
結果
(3, 2)
np.arange(6).shape
結果
(6,)
array_2 = np.arange(30).reshape(5,3,2) array_2
結果
array([[[ 0, 1],
[ 2, 3],
[ 4, 5]],
[[ 6, 7],
[ 8, 9],
[10, 11]],
[[12, 13],
[14, 15],
[16, 17]],
[[18, 19],
[20, 21],
[22, 23]],
[[24, 25],
[26, 27],
[28, 29]]])
参考になった書籍
機械学習入門時には、難しいし、リファレンスとしても使いにくいなどであまり活用しなかったが、特徴量エンジニアリングが必要になるくらいから途端にありがたい書籍になった。Pandasの作者自ら書いた本でNumpyやPandasの使い方が詳細に書かれている。
Pythonサンプルのダウンロード
ここでダウンロードする「numpy_lesson.ipynb」ファイルは、このPython動画で使用したものです。