非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

Python: Numpyでいろいろなデータ生成方法

   

Pythonでデータ処理をする場合numpyをよく使うと思いますが、様々なデータを生成できる関数群があって便利です。基本的なところを備忘録として書き留めておきます。

広告

要素が0だけの配列を生成

すべての要素に「0」を入れて配列を生成するには、zeros関数を使います。( )の中の引数には要素数(行数)を指定します。

arr = np.zeros(10)
print(arr)

'''
出力例
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

'''
 

2次元配列の場合は( )の中に更に( )を入れて行、列を指定します。

arr = np.zeros((10,5))
print(arr)

'''
出力例
[[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]]
'''
 

 

要素が1だけの配列を生成

すべての要素に「1」を入れて配列を生成するには、ones関数を使います。

arr = np.ones(10)
print(arr)

'''
出力例
[ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

'''
 

 

2次元配列の場合です。

arr = np.ones((10,5))
print(arr)

'''
出力例
[[ 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1.]]
'''
 

 

未初期化の配列を生成する

empty関数は初期化しない空っぽの配列を生成してくれます。onesやzerosより高速で生成してくれるらしいです。

無理やり出力しようとすると変な数値が現れます。e-310とほぼゼロなのですが…。

arr = np.empty(10)
print(arr)

'''
出力例
[ 6.91532949e-310 4.64752628e-310 1.18575755e-322 9.52502085e-307
2.37151510e-322 2.37151510e-322 4.64752644e-310 2.12199579e-314
4.64752644e-310 1.04272731e-306]

'''
 

 

2次元配列もご覧の通り。

arr = np.empty((10,2))
print(arr)

'''
出力例
[[ 6.93040396e-310 6.93040396e-310]
[ 6.93038905e-310 6.93038905e-310]
[ 6.93038905e-310 6.93038905e-310]
[ 6.93038905e-310 6.93038905e-310]
[ 6.93038905e-310 6.93038905e-310]
[ 6.93038905e-310 6.93038905e-310]
[ 2.97327062e+222 5.58294180e-322]
[ 4.65628248e-310 6.93040396e-310]
[ 3.55150915e+180 3.99284226e+252]
[ 5.11495720e+199 7.63910741e-095]]
'''
 

 

等間隔の連番を生成

同じ数ではなく、等間隔に数値の連番を生成する場合はarange関数を使います。以下の例は0から10まで1ずつデータを作ってくれる例です。最後が10ではなく9であることに注意しましょう。

arr = np.arange(0, 10, 1)
print(arr)
'''
出力例
[0 1 2 3 4 5 6 7 8 9]

'''
 

 

2ステップの場合はご覧のとおりです。

arr = np.arange(0, 10, 2)
print(arr)

'''
出力例
[0 2 4 6 8]
'''
 

 

乱数を生成する

乱数の配列も1行だけで生成できます。

arr = np.random.rand(10)
print(arr)
'''
出力例
[ 0.41020877 0.23159622 0.91927315 0.29838974 0.38295438 0.58870683
0.52855188 0.68007746 0.0572966 0.43924851]
'''
 

 

正規分布の乱数を生成する

面白いのが同じ乱数でも正規分布を持つ乱数を生成してくれる点です。

arr = np.random.randn(10)
print(arr)

'''
出力例

[ 2.15161849 0.30402259 -0.18432458 2.31902253 -1.46164944 0.80292367
0.18824268 -1.18187314 -0.48655572 0.08605466]

'''
 

 

果たしてちゃんと正規分布データとなってくれているのか、1000データ生成してヒストのグラフを作ってみたところ…。

arr = np.random.randn(1000)
plt.hist(arr, bins=20) # データ範囲20のヒストグラムを作成
plt.show()
 

 

ちゃんと正規分布になってくれています!

 

ランダムウォークデータの生成

更に面白いのが株価の値動きのようなランダムウォークデータも生成できます。グラフ化して見てみましょう。

step = np.random.choice([-1,1],500) # +1と-1のランダムデータを500個生成
arr = np.cumsum(step) # 位置の変化
plt.plot(arr)
plt.show()
 

 

このようにまるで何かの値動きのようなデータが生成できます。これ、何に使うんでしょうねぇ…。

python/numpyは多言語にはない機能が充実しています。今回はデータ生成という基本のところを書きましたが、しばらくnumpyシリーズを続けてみようと思います。

広告

 - Python