NumPyの乱数生成を理解する

機能に追加しての数値計算や多次元配列を利用できるNumPyを使った、次元追加の方法について取り上げてきました。

配列用のデータ型であるndarrayについて、1次元、2次元の配列を確認し2次元の配列を3次元の配列に次元追加するいくつかの方法をまとめてみました。

ご興味ありましたら、ぜひ前回の記事もご覧ください。

さて、今回も引き続きNumPy(ナムパイ)ですが、乱数についてです。自分でもしっくり来づらいところがありましたので調べてみました。

私が勉強しているPythonによるあたらしいデータ分析の教科書(翔泳社)では、P.104〜P.108の部分になります。

目次

乱数とは?

乱数とは、一言でいうとランダムな数のことです。例えば、1〜10の範囲で乱数を3つ作るとすると、「1, 3, 5」、「2, 6, 1」、「9, 10, 4」など毎回ランダムに3つの数字が決まるイメージです。

Pythonではデータ分析でもよく使われることから、何らかの分析をシミュレーションする際に乱数を生成してその乱数に対して分析をかけてみるなどで使う機会があります。

Pythonで乱数を使う方法

Pythonで乱数を使う方法は、実はPythonの標準モジュール(random)でも可能ですが、NumPyにも乱数生成機能(np.random)があります。

基本として使うもの、実用的に使うものを確認していきます。

1.np.random.random

まずは、rp.random.random関数です。

これは、行と列のタプルを渡すと0以上、1未満の範囲の乱数の2次元配列を作成してくれるものです。

乱数ですので、実行されるごとに出力される数は変化します。

# 2行3列の0以上1未満の範囲の乱数を生成 np.random.random((2, 3))

1回目の出力結果

array([[0.39998707, 0.8660341 , 0.0993488 ],
       [0.18636305, 0.54046982, 0.8385945 ]])

2回目の出力結果

array([[0.87060645, 0.52723734, 0.49195732],
       [0.31845742, 0.76938227, 0.40252174]])

乱数生成の場合は、毎回同じ結果を出すことでプログラムの再現性を確保することが必要な場合もあります。乱数が実行した場合にすべてバラバラになってしまうと、そのプログラムが正しく動作しているのかを確認しづらいためです。

こういった場合には、「シード値」というものを利用して結果を固定します。

np.random.seed()という書き方になります。()に入れる数字が結果を判別する番号(シード値)になります。今回は10をシード値として設定してみました。

np.random.seed(10) np.random.random((3, 2))

出力結果

array([[0.77132064, 0.02075195],
       [0.63364823, 0.74880388],
       [0.49850701, 0.22479665]])

もう1回実行してみる。

np.random.seed(10) np.random.random((3, 2))

出力結果

array([[0.77132064, 0.02075195],
       [0.63364823, 0.74880388],
       [0.49850701, 0.22479665]])

このように、乱数ではあるのですが出力結果を固定させたい場合にはシード値を利用します。

2.np.random.rand

次は、np.random.rand関数です。

np.random.random関数と基本的には同じで、こちらは0〜1の範囲の配列を生成するのですが、random関数の場合は行と列のタプルを渡していたところが、rand関数では2つの引数で表すような書き方になります。こちらのほうが直感的には分かりやすい感じもします。

# 2行3列の0以上1未満の範囲の乱数を生成 np.random.rand(2, 3)

1回目の出力結果

array([[0.91777412, 0.71457578, 0.54254437],
       [0.14217005, 0.37334076, 0.67413362]])

2回目の出力結果

array([[0.44183317, 0.43401399, 0.61776698],
       [0.51313824, 0.65039718, 0.60103895]])

もちろん、シード値を使った結果の固定も可能です。

3.np.random.randint

次は、np.random.randint関数です。

第1引数以上かつ第2引数未満のランダムな整数値を、第3引数としてタプルで渡した行と列の2次元配列で生成する事ができます。

intは整数の意味がありますので、分かりやすいですね。

一番シンプルなパターン

# 2以上20未満の整数をランダムで生成 np.random.randint(2, 20)

1回目の出力結果:19

2回目の出力結果:4

第3引数をタプルで渡したときのパターン

# 2以上20未満の整数をランダムで生成し、3行4列の行列で表現 np.random.randint(2, 20, (3, 4))

1回目の出力結果

array([[16,  9, 13,  3],
       [ 2, 14,  7,  6],
       [ 9, 14,  4, 10]])

2回目の出力結果

array([[17, 15, 17,  8],
       [12, 13, 18, 14],
       [ 2, 19, 17, 14]])

このように整数の乱数を作る場合はとても便利です。もちろん、シード値を使った結果の固定も可能です。

4.np.random.uniform

次は、np.random.uniform関数です。

第1引数以上かつ第2引数未満のランダムな小数値を、第3引数としてタプルで渡した行と列の2次元配列で生成することができます。

先程のnp.random.randint関数の小数値版です。

一番シンプルなパターン

# 0.0以上5.5未満の整数をランダムで生成 np.random.uniform(0.0, 5.5)

1回目の出力結果:1.2705292583563312

2回目の出力結果:4.856045366872552

第3引数をタプルで渡したときのパターン

# 0.0以上5.5未満の整数をランダムで生成し、3行3列の行列で表現 np.random.uniform(0.0, 5.5, (3, 3))

1回目の出力結果

array([[5.1067274 , 1.52927367, 2.46239875],
       [3.35430458, 1.98434287, 2.44885093],
       [0.24343067, 1.36122536, 2.55823332]])

2回目の出力結果

array([[0.99506331, 1.95895962, 1.67745268],
       [3.99354315, 1.47463632, 1.89857694],
       [1.94547003, 1.44712794, 2.98521048]])

このように小数値の乱数を作る場合もとても便利にできます。もちろんこちらも、シード値を使った結果の固定も可能です。

5.np.random.randon

最後が、np.random.randon関数です。

出力される乱数が標準正規分布に従って、平均0、分散1の分布で出力されます。データ分析などで特によく使われ、統計やデータ分析をやっていきたい人には必修事項です。正規分布という統計学で最もよく利用される、平均値を中心にしてベル型の左右対称の連続型の確率分布のことで、特に平均0、分散1の正規分布のことを標準正規分布といいます。

# 3行2列の標準正規分布の範囲の乱数生成 np.random.randn(3, 2)

1回目の出力結果

array([[-0.85637338, -1.07553265],
       [-1.66521307, -1.63913029],
       [ 2.28071997,  0.82292265]])

2回目の出力結果

array([[-0.78878681,  0.12878192],
       [-0.83848544, -1.63397285],
       [-0.67980614, -0.84758918]])

このようになります。シード値を使った結果の固定も可能です。

Pythonのデータ分析では乱数を理解

いかがでしたでしょうか。

今回は、NumPyの乱数について書いてきました。

何らかのランダムな数を元にデータ分析用のコードの出力結果を確認したいという状況は多いです。乱数の作り方はしっかり覚えておきたいところだと思いました。

Pythonでデータ分析をする上では、NumPyは必須項目です。理解すべき項目も多いですが、細かい部分を理解しておくことで応用が効くようになると思いますので、頑張りましょう。

インターネットアカデミーは、Python講座が充実しています。Python認定スクールにもなっているため質の高い知識を得ることができ、基礎学習の先にあるそれぞれの目標を目指していくためには良い場所となります。

よく、「プログラミングは独学でもなんとかなる」という情報もありますが、新しいことを学んでいく際の近道は「プロに教えてもらうこと」だと思います。

インターネットアカデミーはキャリアサポートも充実しており、一人ひとりに専任のキャリアプロデューサーがサポートしてくれるため中途半端になることがありません。

ご興味ある方は各講座のページを覗いてみてください。無料カウンセリングもできます。

良い記事だなって思ったら、是非シェアをお願いします!
  • URLをコピーしました!
  • URLをコピーしました!
目次