[Python] NumPy – 全要素を乱数で初期化した配列を作成する方法
NumPyを使用して全要素を乱数で初期化した配列を作成するには、numpy.random
モジュールを利用します。
例えば、numpy.random.rand()
は0から1の範囲で一様分布に従う乱数を生成し、指定した形状の配列を作成します。
また、numpy.random.randn()
は標準正規分布に従う乱数を生成します。
さらに、numpy.random.randint()
を使うと、指定した範囲内の整数乱数を持つ配列を作成できます。
一様分布に基づく乱数配列の作成
一様分布に基づく乱数は、指定した範囲内で均等に分布する乱数を生成します。
NumPyライブラリを使用することで、簡単に乱数配列を作成することができます。
numpy.random.rand()の使い方
numpy.random.rand()関数
は、0から1の範囲で一様分布に従った乱数を生成します。
この関数は、引数に指定した形状の配列を返します。
import numpy as np
# 1次元配列を生成
random_array_1d = np.random.rand(5)
print(random_array_1d)
[0.12345678 0.23456789 0.34567890 0.45678901 0.56789012]
任意の形状の配列を作成する方法
numpy.random.rand()
では、引数に配列の形状を指定することで、任意の次元の配列を生成できます。
例えば、2次元配列や3次元配列も簡単に作成できます。
import numpy as np
# 2次元配列を生成
random_array_2d = np.random.rand(3, 4) # 3行4列の配列
print(random_array_2d)
[[0.12345678 0.23456789 0.34567890 0.45678901]
[0.56789012 0.67890123 0.78901234 0.89012345]
[0.90123456 0.01234567 0.12345678 0.23456789]]
乱数の範囲を指定する方法
numpy.random.rand()
で生成される乱数は0から1の範囲ですが、任意の範囲にスケーリングすることができます。
例えば、範囲を[a, b]に設定する場合、次のように計算します。
\[\text{乱数} = a + (b – a) \times \text{numpy.random.rand()}\]
import numpy as np
# 範囲を指定して乱数を生成
a = 10
b = 20
random_array_scaled = a + (b - a) * np.random.rand(5)
print(random_array_scaled)
[12.34567890 15.67890123 18.90123456 11.23456789 19.87654321]
具体例:2次元配列の作成
2次元配列を生成し、特定の範囲にスケーリングした乱数を作成する具体例を示します。
import numpy as np
# 2次元配列を生成し、範囲を指定
a = 5
b = 15
random_array_2d_scaled = a + (b - a) * np.random.rand(3, 4) # 3行4列の配列
print(random_array_2d_scaled)
[[ 6.12345678 9.23456789 12.34567890 14.45678901]
[ 7.56789012 10.67890123 13.78901234 5.89012345]
[ 8.90123456 11.01234567 6.12345678 9.23456789]]
このように、NumPyを使用することで、一様分布に基づく乱数配列を簡単に作成することができます。
正規分布に基づく乱数配列の作成
正規分布に基づく乱数は、平均値を中心にデータが分布する特性を持っています。
NumPyライブラリを使用することで、簡単に正規分布に従った乱数配列を生成できます。
numpy.random.randn()の使い方
numpy.random.randn()関数
は、標準正規分布(平均0、標準偏差1)に従った乱数を生成します。
この関数は、引数に指定した形状の配列を返します。
import numpy as np
# 1次元配列を生成
random_array_1d = np.random.randn(5)
print(random_array_1d)
[-0.12345678 0.23456789 -0.34567890 0.45678901 1.56789012]
標準正規分布とその応用
標準正規分布は、平均が0、標準偏差が1の正規分布です。
この分布は、統計学や機械学習において非常に重要で、データの正規化や異常値検出などに利用されます。
正規分布に従うデータは、中心付近に多く集まり、両端に少なくなる特性があります。
具体例:3次元配列の作成
3次元配列を生成することで、より複雑なデータ構造を扱うことができます。
以下のコードでは、3次元配列を生成します。
import numpy as np
# 3次元配列を生成
random_array_3d = np.random.randn(2, 3, 4) # 2x3x4の配列
print(random_array_3d)
[[[-0.12345678 0.23456789 -0.34567890 0.45678901]
[ 1.56789012 -0.67890123 0.78901234 -1.89012345]
[ 0.90123456 0.01234567 -0.12345678 0.23456789]]
[[ 0.34567890 -0.45678901 1.23456789 -0.67890123]
[-1.23456789 0.67890123 0.89012345 -0.12345678]
[ 0.56789012 -0.90123456 1.23456789 -0.34567890]]]
平均と標準偏差を指定する方法
numpy.random.randn()
で生成される乱数は標準正規分布に従いますが、任意の平均と標準偏差を指定することも可能です。
平均を\(\mu\)、標準偏差を\(\sigma\)とした場合、次のように計算します。
\[\text{乱数} = \mu + \sigma \times \text{numpy.random.randn()}\]
import numpy as np
# 平均と標準偏差を指定して乱数を生成
mu = 10 # 平均
sigma = 2 # 標準偏差
random_array_scaled = mu + sigma * np.random.randn(5)
print(random_array_scaled)
[ 8.12345678 12.23456789 9.34567890 11.45678901 7.56789012]
このように、NumPyを使用することで、正規分布に基づく乱数配列を簡単に作成し、さまざまな応用が可能です。
整数乱数を使った配列の作成
整数乱数は、指定した範囲内の整数をランダムに生成するために使用されます。
NumPyライブラリを利用することで、簡単に整数乱数を含む配列を作成できます。
numpy.random.randint()の使い方
numpy.random.randint()関数
は、指定した範囲内の整数乱数を生成します。
この関数は、引数に最小値、最大値、生成する配列の形状を指定することで、任意の整数乱数を生成します。
import numpy as np
# 整数乱数を生成
random_integers = np.random.randint(0, 10, size=5) # 0から9の範囲で5つの整数を生成
print(random_integers)
[3 7 1 4 9]
範囲を指定した整数乱数の生成
numpy.random.randint()
では、最小値と最大値を指定することで、任意の範囲の整数乱数を生成できます。
最大値は含まれず、最小値は含まれます。
import numpy as np
# 範囲を指定して整数乱数を生成
random_integers_range = np.random.randint(5, 15, size=10) # 5から14の範囲で10個の整数を生成
print(random_integers_range)
[ 6 12 9 5 14 8 11 7 13 10]
具体例:整数乱数を使った配列の作成
整数乱数を使って、特定の形状の配列を生成する具体例を示します。
以下のコードでは、2次元配列を生成します。
import numpy as np
# 2次元配列を生成
random_integers_2d = np.random.randint(1, 100, size=(3, 4)) # 1から99の範囲で3行4列の配列を生成
print(random_integers_2d)
[[12 45 67 89]
[23 34 56 78]
[90 11 22 33]]
乱数のシード値を設定する方法
乱数のシード値を設定することで、生成される乱数を再現可能にすることができます。
シード値を設定するには、numpy.random.seed()関数
を使用します。
import numpy as np
# シード値を設定
np.random.seed(42) # シード値を42に設定
random_integers_seeded = np.random.randint(0, 10, size=5)
print(random_integers_seeded)
[6 3 7 4 6]
シード値を設定することで、同じシード値を使用する限り、毎回同じ乱数を生成することができます。
これにより、実験やデバッグの際に一貫性を持たせることが可能です。
乱数シードの設定と再現性
乱数シードは、乱数生成の初期値を設定するための数値です。
シードを設定することで、生成される乱数の系列を再現可能にすることができます。
これは、実験やデバッグの際に非常に重要です。
乱数シードとは
乱数シードとは、乱数生成アルゴリズムの初期値のことを指します。
シード値を指定することで、同じシード値を使用する限り、毎回同じ乱数を生成することができます。
これにより、実験結果の再現性が確保され、結果の検証が容易になります。
numpy.random.seed()の使い方
NumPyでは、numpy.random.seed()関数
を使用して乱数シードを設定します。
この関数に整数を引数として渡すことで、シード値を指定します。
import numpy as np
# シード値を設定
np.random.seed(123) # シード値を123に設定
random_numbers = np.random.rand(5) # 乱数を生成
print(random_numbers)
[0.69646919 0.28613933 0.22685145 0.55131477 0.71946897]
再現性のある乱数配列の作成
シード値を設定することで、再現性のある乱数配列を作成できます。
以下のコードでは、同じシード値を使用して、再度乱数を生成します。
import numpy as np
# シード値を設定
np.random.seed(123) # シード値を123に設定
random_numbers_first = np.random.rand(5) # 乱数を生成
print(random_numbers_first)
# 再度同じシード値を設定
np.random.seed(123) # シード値を再設定
random_numbers_second = np.random.rand(5) # 乱数を生成
print(random_numbers_second)
[0.69646919 0.28613933 0.22685145 0.55131477 0.71946897]
[0.69646919 0.28613933 0.22685145 0.55131477 0.71946897]
このように、同じシード値を使用することで、同じ乱数配列を再生成することができます。
シード値を使った実験の再現性確保
シード値を設定することは、実験の再現性を確保するために重要です。
特に、機械学習や統計分析において、データの分割やモデルの初期化に乱数が使用される場合、シード値を設定することで、実験結果を他の人と共有したり、後で再現したりすることが容易になります。
import numpy as np
# シード値を設定
np.random.seed(42) # シード値を42に設定
train_data = np.random.rand(10) # トレーニングデータを生成
test_data = np.random.rand(10) # テストデータを生成
print("トレーニングデータ:", train_data)
print("テストデータ:", test_data)
トレーニングデータ: [0.37454012 0.95071431 0.73199394 0.59865848 0.15601864 0.15599452
0.05808361 0.86617615 0.60111501 0.70807258]
テストデータ: [0.02058449 0.96990985 0.83244264 0.21233911 0.18182497 0.18340451
0.30424224 0.52475643 0.43194502 0.29122914]
このように、シード値を設定することで、実験の結果を再現可能にし、信頼性の高い分析を行うことができます。
応用例:特定の分布に基づく乱数配列の作成
NumPyを使用すると、さまざまな確率分布に基づいた乱数を生成することができます。
ここでは、指数分布、二項分布、ポアソン分布、ガンマ分布に基づく乱数配列の作成方法を紹介します。
指数分布に基づく乱数配列の作成
指数分布は、特定の事象が発生するまでの時間をモデル化するために使用されます。
NumPyでは、numpy.random.exponential()関数
を使用して、指数分布に従った乱数を生成できます。
import numpy as np
# 指数分布に基づく乱数を生成
scale = 1.0 # スケールパラメータ(平均)
random_exponential = np.random.exponential(scale, size=5) # 5つの乱数を生成
print(random_exponential)
[0.12345678 1.23456789 0.98765432 0.45678901 2.34567890]
二項分布に基づく乱数配列の作成
二項分布は、成功と失敗の2つの結果を持つ試行を複数回行ったときの成功回数をモデル化します。
NumPyでは、numpy.random.binomial()関数
を使用して、二項分布に従った乱数を生成できます。
import numpy as np
# 二項分布に基づく乱数を生成
n = 10 # 試行回数
p = 0.5 # 成功確率
random_binomial = np.random.binomial(n, p, size=5) # 5つの乱数を生成
print(random_binomial)
[5 4 6 3 7]
ポアソン分布に基づく乱数配列の作成
ポアソン分布は、一定の時間内に発生する事象の回数をモデル化します。
NumPyでは、numpy.random.poisson()関数
を使用して、ポアソン分布に従った乱数を生成できます。
import numpy as np
# ポアソン分布に基づく乱数を生成
lam = 3.0 # 平均発生率
random_poisson = np.random.poisson(lam, size=5) # 5つの乱数を生成
print(random_poisson)
[2 3 4 1 5]
ガンマ分布に基づく乱数配列の作成
ガンマ分布は、待ち時間や寿命などの非負の連続変数をモデル化するために使用されます。
NumPyでは、numpy.random.gamma()関数
を使用して、ガンマ分布に従った乱数を生成できます。
import numpy as np
# ガンマ分布に基づく乱数を生成
shape = 2.0 # 形状パラメータ
scale = 1.0 # スケールパラメータ
random_gamma = np.random.gamma(shape, scale, size=5) # 5つの乱数を生成
print(random_gamma)
[1.23456789 2.34567890 0.98765432 3.45678901 1.67890123]
これらの方法を使用することで、さまざまな確率分布に基づいた乱数配列を簡単に生成することができます。
これにより、シミュレーションや統計分析など、さまざまな応用が可能になります。
応用例:乱数を使ったシミュレーション
乱数は、さまざまなシミュレーションやデータ処理において重要な役割を果たします。
ここでは、モンテカルロ法によるシミュレーション、乱数を使ったデータのシャッフル、乱数を使ったサンプリングの3つの応用例を紹介します。
モンテカルロ法によるシミュレーション
モンテカルロ法は、確率的な問題を解決するために乱数を使用する手法です。
例えば、円の面積を求めるために、正方形内にランダムに点を打ち、円内に入った点の割合を計算することで、円の面積を推定することができます。
import numpy as np
import matplotlib.pyplot as plt
# シミュレーションの回数
num_samples = 10000
# ランダムな点を生成
x = np.random.rand(num_samples)
y = np.random.rand(num_samples)
# 円の内外を判定
inside_circle = (x**2 + y**2) <= 1
# 円内の点と円外の点をプロット
plt.scatter(x[inside_circle], y[inside_circle], color='blue', s=1)
plt.scatter(x[~inside_circle], y[~inside_circle], color='red', s=1)
plt.title('Monte Carlo Simulation: Estimating Pi')
plt.xlabel('X')
plt.ylabel('Y')
plt.axis('equal')
plt.show()
# 円の面積の推定
pi_estimate = 4 * np.sum(inside_circle) / num_samples
print("推定されたπの値:", pi_estimate)
推定されたπの値: 3.1412
乱数を使ったデータのシャッフル
データのシャッフルは、データセットの順序をランダムに入れ替える操作です。
これにより、データの偏りをなくし、機械学習モデルのトレーニングにおいてより一般化された結果を得ることができます。
NumPyでは、numpy.random.shuffle()関数
を使用してデータをシャッフルできます。
import numpy as np
# データの作成
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# データをシャッフル
np.random.shuffle(data)
print("シャッフルされたデータ:", data)
シャッフルされたデータ: [3 1 4 2 5 6 8 7 10 9]
乱数を使ったサンプリング
サンプリングは、全体のデータセットから一部のデータをランダムに選択するプロセスです。
NumPyでは、numpy.random.choice()関数
を使用して、指定した数のサンプルをランダムに選ぶことができます。
import numpy as np
# データの作成
population = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# サンプリング
sample_size = 3
random_sample = np.random.choice(population, size=sample_size, replace=False) # 重複なしでサンプリング
print("ランダムに選ばれたサンプル:", random_sample)
ランダムに選ばれたサンプル: [4 7 2]
これらの応用例を通じて、乱数を使用したシミュレーションやデータ処理の方法を理解することができます。
乱数は、さまざまな分野での分析やモデリングにおいて非常に重要な役割を果たしています。
まとめ
この記事では、NumPyを使用した乱数生成の基本から応用までを振り返りました。
具体的には、一様分布や正規分布、整数乱数、特定の分布に基づく乱数の生成方法、さらには乱数を利用したシミュレーションやデータ処理の手法について詳しく解説しました。
これらの知識を活用して、実際のデータ分析やシミュレーションに挑戦してみることをお勧めします。