NumPy は、Python で高速計算やデータ加工をスムーズに行うためのライブラリです。
ディープラーニングなどの人工知能や機械学習、
時系列分析など、データ分析や統計解析などでも頻繁に使われます。
NumPy を使いこなすことで、
複雑な演算を、サクッと実装でき、プログラミングが加速させることができます。
NumPyは、高次元データを扱うことが多いのですが、
- まずは1次元で試す
というステップを踏むのが有効です。
いきなり高次元データを扱うよりも、ミスが減り、デバッグを容易にしてくれます。
試しの1次元データでの計算には、
わかりやすい1次元データを使うのがより有効です。
1次元データの生成には、これまで
- 整数列を生成する方法(初期化)
を2話に分けて、ご紹介しました↓
これらは、基本的に整数や実数の規則的な数列の生成を行えます。
しかし、規則的な数列でない、ランダムなデータが必要な場合も多くあります。
例えば、人工知能やデータ分析、統計解析などです。
ランダムな値は、「乱数」とも呼ばれます。
特に、ある範囲の値が出る確率が同じ(一様)な状態から生成される乱数を、「一様乱数」と呼びます。
そこで本記事では、
データ分析や人工知能、統計解析などでも役立つ
NumPy での一様乱数の生成、初期化の方法
- np.random.rand
- np.random.randint
について、サクッと、わかりやすく、まとめます。
【Python NumPy random rand】ベクトル・行列の生成・初期化方法(7):1次元配列(ベクトル)・乱数数列の生成方法(random rand randint seed)について、サンプルコードとともに、サクッとわかりやすくまとめました【Python 入門】
「NumPy」で浮動小数型の乱数の生成・初期化:(np.random.rand)
np.random.rand( ) で、浮動小数型の乱数を1個、生成できる
np.random.rand( ) を使うと、
- 0以上1未満の、浮動小数点型の乱数を1個、生成
することができます。
乱数なので、毎回違う値が生成されます。
確かめてみましょう。
確かに、3回とも違う乱数が生成されています。
np.random.rand(個数) で、実数乱数を個数個、生成できる
乱数を複数個生成したい場合には、
np.random.rand( 個数 )
として生成させることができます。
上の例では、np.random.rand(5) として、
5個の乱数(0以上1未満の範囲)を生成していることがわかります。
np.random.rand(行数、列数) で、実数乱数の行列を生成できる
np.random.rand(3, 2)のように、2つの数字を指定すると、
生成した乱数の行列を生成できます。
3が行数、2が列数に対応します。
ちなみに、行列の要素が乱数でなく、
- すべて0の行列
- すべて1行列
- 単位行列
を生成・初期化する方法は、以下の記事でまとめています。
『【Python NumPy】ベクトル・行列の生成・初期化方法(3):単位行列の生成( identity、eye)について、サンプルコードとともに、サクッとわかりやすくまとめました【Python 入門】』
これまでは、毎回違う乱数が生成されていました。
毎回同じ乱数がほしい場合もあります。
そこで同じ乱数を生成する方法をご紹介します。
np.random.seed (特定の値)で、毎回同じ乱数を生成できる
同じ乱数は、2段階で生成できます。
- (1), np.random.seed(値)
- (2), np.random.rand( )
(1)のnp.random.seed の値を同じ値にセットすることで、
(2)のnp.random.randで同じ値を生成できます。
In[12]で np.random.seed(3)として、
値を3にセットしています。
その後、In[13] でnp.random.rand(5) で乱数を生成しています。
もう1度、同じことをIn[15]とIn[16] でやってみると、
Out[13] とOut[16] のように、同じ乱数が生成されていることがわかります。
ただし注意点があります。
np.random.seed(値)の効果は、1回だけです。
1度 乱数を生成させたら、効果はなくなります。
実際、In[16] に続けて、In[17]で乱数を生成させると、
Out[17]のように、それまでとは異なる乱数が生成されています。
なので、同じ乱数を生成させたいときには、
- 同じseed の値をセットして乱数生成
これをセットで繰り返す必要があるわけです。
ここまでは、0以上1未満の範囲で乱数を生成していました。
それ以外の範囲の乱数を生成することができます。
乱数の値の範囲は自分で指定できる
例えば、生成したい乱数の範囲が、
4以上5未満の値
で生成したいとします。
この場合、In[22]のように、
(5-4)×np.random,rand()+4
として生成します。
Out[21][22][23]のように、確かに、4以上5未満の乱数が生成されています。
もう1つ例を挙げてみます。
10以上20未満の乱数を生成させたいなら、
以下のようにすればオッケーです。
この場合にも、先にnp.random.seed( ) をセットすることで
同じ乱数を生成することができます。
複数個の乱数を生成したいなら、
np.random.rand( 個数 )
np.random.rand(行数、列数)
のようにすればオッケーです
ここまでは、浮動小数型の乱数の生成方法でした。
場合によては、整数型の乱数を生成させたいこともあるかと思います。
np.random.randint( ) で、整数の一様乱数を生成できる
np.random.randint(整数) を使うことで、
0以上整数未満の範囲の整数の乱数を1個生成できます。
np.random.randint(5) では、
0以上5未満の範囲の整数(0, 1, 2, 3, 4)のどれかをランダムに生成することができます。
np.random.randint( )で、0スタート以外の範囲の整数乱数を生成する
0スタート以外の範囲の整数乱数を生成させることもできます。
In[49]のように、
np.random.randint(5,8)
とすることで、5以上8未満の整数(5、6、7)のどれかを1個生成させることができます。
np.random.randint( )で、複数個の整数乱数を生成する(size = 個数)
整数乱数も複数個生成することができます。
In[46] の np.random.randint(5, 8, size=3) の
size = 3
を指定することで、3個生成させることができます。
np.random.randint( )で、整数乱数の行列を生成する(size = (行数, 列数))
整数乱数の行列を生成することができます。
In[47]の np.random.randint(5, 8, size=(3,2)) の
size = (3, 2)
を指定することで、3行2列の整数乱数行列を生成することができます。
np.random.randint( ) と np.random.rand( ) の違い
- np.random.randint (値)
の値の意味は、範囲の最大値になります。
それに対して、浮動小数点型を生成する
- np.random.rand(値)
の値の意味は、値の個数だけ乱数を生成するという、個数の意味になります。
これらの違いを気をつけておきましょう。
np.random.randint( ) とnp.random.rand( ) の違いとしては、もう1つ挙げておきますね。
np.random.randint( ) では、かっこの中には数値を入れる必要があります。
数値を入れないと上のようなエラーが出ます。
(”少なくとも1つの引数を入れましょう”とエラーが出ています)
それに対して、
np.random.rand( )では、値を入れなければ、
0以上1未満の範囲で、浮動小数点型の乱数が1つ返されます。エラーにはなりません。
というわけで、本記事では、
データ分析や人工知能、統計解析などでも役立つ
NumPy での一様乱数の生成、初期化の方法
- np.random.rand
- np.random.randint
について、サクッと、わかりやすく、まとめました。
次の第8話では、確率分布にしたがった乱数の生成方法について、サクッと、わかりやすく解説しています。
統計解析やデータ分析などをやってみたい方は特に必見の記事となっています↓
こちらもございます↓