note.nkmk.me

NumPy, randomで様々な種類の乱数の配列を生成

Date: 2017-03-01 / Modified: 2018-03-05 / tags: Python, NumPy
このエントリーをはてなブックマークに追加

numpy.randomモジュールに、乱数に関するたくさんの関数が提供されている。

ここでは、

  • 一様分布の乱数生成
    • numpy.random.rand(): 0.0以上、1.0未満
    • numpy.random.random_sample(): 0.0以上、1.0未満
    • numpy.random.randint(): 任意の範囲の整数
  • 正規分布の乱数生成
    • numpy.random.randn(): 平均0、標準偏差1
    • numpy.random.normal(): 任意の平均、標準偏差
  • 二項分布の乱数生成
    • numpy.random.binomial()
  • ベータ分布の乱数生成
    • numpy.random.beta()
  • ガンマ分布の乱数生成
    • numpy.random.gamma()
  • カイ二乗分布の乱数
    • numpy.random.chisquare()

について、サンプルコードとともに説明する。

スポンサーリンク

numpy.random.rand(): 一様分布(0.0以上、1.0未満)

np.random.rand()[0.0, 1.0)(0.0以上、1.0未満)の乱数を返す。

引数としてサイズを整数d0, d1, ... , dnで渡す。

import numpy as np

rand = np.random.rand()  # 一つの乱数
print(rand)
# 0.5399711080561779

arr = np.random.rand(3)  # サイズが3の配列の乱数
print(arr)
# [ 0.22393312  0.56723404  0.41167989]

arr = np.random.rand(4, 4)  # 4 x 4の配列の乱数
print(arr)
# [[ 0.98109413  0.43272792  0.78808567  0.14697466]
#  [ 0.14529422  0.66417579  0.62020433  0.39887021]
#  [ 0.78762131  0.3616854   0.76995665  0.25530529]
#  [ 0.59426681  0.64130992  0.41451061  0.2356074 ]]

arr = np.random.rand(3, 2, 2)  # 3 x 2 x 2の配列の乱数
print(arr)
# [[[ 0.26072665  0.63424568]
#   [ 0.43025675  0.88787556]]
#
#  [[ 0.58189813  0.57733422]
#   [ 0.4312518   0.12558879]]
#
#  [[ 0.58588003  0.58290714]
#   [ 0.58133023  0.05894161]]]

0.0以上、1.0未満ではなく、任意の範囲([a, b): a以上、b未満)の乱数を取得したい場合は、以下のようにする。

(b - a) * np.random.rand() + a

numpy.random.random_sample(): 一様分布(0.0以上、1.0未満)

np.random.random_sample()np.random.rand()と同じく、[0.0, 1.0)(0.0以上、1.0未満)の乱数を返す。

np.random.rand()との違いはサイズの指定方法。

np.random.random_sample()ではサイズをタプル(d0, d1, ... , dn)(一次元の場合は整数)で渡す。

rand = np.random.random_sample()  # 一つの乱数
print(rand)
# 0.7812294650415362

arr = np.random.random_sample(3)  # サイズが3の配列の乱数
print(arr)
# [ 0.31315625  0.75406842  0.51955327]

arr = np.random.random_sample((4, 4))  # 4 x 4の配列の乱数
print(arr)
# [[ 0.17710988  0.63316992  0.00101942  0.94233375]
#  [ 0.9439738   0.58700846  0.97807038  0.56899597]
#  [ 0.62050185  0.23601975  0.57513176  0.56947325]
#  [ 0.64393715  0.92796497  0.83784537  0.1544701 ]]

arr = np.random.random_sample((3, 2, 2))  # 3 x 2 x 2の配列の乱数
print(arr)
# [[[ 0.26624554  0.33096779]
#   [ 0.1814989   0.12867246]]
#
#  [[ 0.1435755   0.45274324]
#   [ 0.12867198  0.98908694]]
#
#  [[ 0.86989893  0.67003622]
#   [ 0.17530006  0.03146698]]]

print(np.random.random_sample is np.random.random)
# True => np.random.random_sampleとnp.random.randomは同一

そのほか、

  • np.random.random()
  • np.random.ranf()
  • np.random.sample()

はすべて、np.random.random_sample()の別名(エイリアス)で、機能は全く同じ。

numpyのソースコード参照。

# Some aliases:
ranf = random = sample = random_sample
__all__.extend(['ranf', 'random', 'sample'])

numpy.random.randint(): 一様分布(任意の範囲の整数)

np.random.randint()は任意の範囲の整数の乱数を返す。

引数として最小値、最大値、サイズ、および、型を渡す。サイズはタプル。

最小値以上、最大値未満の範囲の整数の乱数を返す。

numpy.random.randint(low, high=None, size=None, dtype='l')
numpy.random.randint — NumPy v1.12 Manual

arr = np.random.randint(4, 10, (3, 3))  # 4以上10未満の3 x 3の配列の整数乱数
print(arr)
# [[9 5 6]
#  [4 8 9]
#  [9 8 5]]

numpy.random.randn(): 正規分布(平均0、標準偏差1)

np.random.randn()は、平均0、標準偏差1の正規分布に従う乱数を返す。

サイズを整数d0, d1, ... , dnで渡す。

arr = np.random.randn(3, 3)
print(arr)
# [[-0.25630308  0.86118703  0.7163906 ]
#  [-0.63096426 -2.09983061  1.28259567]
#  [ 1.45971205  0.2939326   0.64207751]]

numpy.random.normal(): 正規分布(任意の平均、標準偏差)

np.random.normal()は、平均loc、標準偏差scaleの正規分布に従う乱数を返す。

サイズをタプル(d0, d1, ... , dn)(一次元の場合は整数)で渡す。

numpy.random.normal(loc=0.0, scale=1.0, size=None)
numpy.random.normal — NumPy v1.12 Manual

arr = np.random.normal(-2, 0.5, (3, 3))
print(arr)
# [[-2.40461812 -2.76365861 -1.70312821]
#  [-2.29453302 -1.53210319 -1.49669024]
#  [-1.90580765 -1.45375908 -2.44137036]]

numpy.random.binomial(): 二項分布

np.random.binomial()は、パラメータn, pの二項分布に従う乱数を返す。

サイズをタプル(d0, d1, ... , dn)(一次元の場合は整数)で渡す。

arr = np.random.binomial(10, 0.5, 10)
print(arr)
# [7 4 7 5 7 8 5 5 3 4]

numpy.random.beta(): ベータ分布

np.random.beta()は、パラメータa, bのベータ分布に従う乱数を返す。

サイズをタプル(d0, d1, ... , dn)(一次元の場合は整数)で渡す。

arr = np.random.beta(2, 2, 10)
print(arr)
# [ 0.36516508  0.86746749  0.54430968  0.31152791  0.57359928  0.48281988
#   0.70518635  0.57312808  0.09019818  0.87831173]

numpy.random.gamma(): ガンマ分布

np.random.gamma()は、形状母数shape、尺度母数scaleのガンマ分布に従う乱数を返す。

サイズをタプル(d0, d1, ... , dn)(一次元の場合は整数)で渡す。

arr = np.random.gamma(5, 1, 10)
print(arr)
# [ 3.86630062  1.69144819  3.07071675  3.14181626  3.61405871  8.37772201
#   5.47063142  4.80523142  3.68531649  4.43143731]

numpy.random.chisquare(): カイ二乗分布

np.random.chisquare()は、自由度dfのカイ二乗分布に従う乱数を返す。

サイズをタプル(d0, d1, ... , dn)(一次元の場合は整数)で渡す。

arr = np.random.chisquare(3, 10)
print(arr)
# [ 0.49617849  2.39966829  2.84359974  3.5340327   0.71761612  2.04619564
#   0.35930769  4.00448281  1.2907048   2.99259386]
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事