NumPyの配列作成

NumPyの配列作成時によく使われそうな関数を紹介します。Pythonの配列とも多少違うのでしっかりと確認しましょう。自分もしょっちゅう忘れるので備忘録も兼ねて記載します。
指定した数字で配列を作成
zeros
指定した配列または数字を全てゼロを挿入します。
zeros( 配列または数字, dtype=型 )
import numpy as np
np.zeros((2,4), dtype=int)
【実行結果】
array([[0, 0, 0, 0],
[0, 0, 0, 0]])
zeros_like
指定した配列と同じ形状を持つ配列を作成。要素は全てゼロで挿入される。
zeros_like( a, dtype=none )
a | 配列を指定。ここで指定した配列と同じ形状の配列を作成。 |
dtype | (オプション)出力するデータの型(int,floatなど)を指定 |
import numpy as np
a = np.random.rand(3,2)
b = np.zeros_like(a)
print(a)
print(b)
【実行結果】
[[0.41550344 0.78356554]
[0.9014983 0.20246867]
[0.38522346 0.52750318]]
[[0. 0.]
[0. 0.]
[0. 0.]]
ones
指定した配列または数字を1で埋め込みます。
ones( 配列または数字, dtype=型 )
import numpy as np
np.ones((5, 6), dtype=float)
【実行結果】
array([[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.]])
full
指定した値を指定した配列または数字に挿入します(下記のコードの場合1.4142)。
full( 配列または数字, 挿入する値 )
import numpy as np
np.full((3, 5), 1.4142)
【実行結果】
array([[1.4142, 1.4142, 1.4142, 1.4142, 1.4142],
[1.4142, 1.4142, 1.4142, 1.4142, 1.4142],
[1.4142, 1.4142, 1.4142, 1.4142, 1.4142]])
一定間隔の数字で配列を作成
arange
指定した範囲の数字を一定の間隔で埋めていきます。
下記の場合0から26までの数字で2間隔で配列に埋め込んでいます。
arange( [開始する数字,] 終了する数字, [挿入する数字の間隔,] [dtype=型] )
import numpy as np
np.arange(0, 26, 2)
【実行結果】
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24])
linspace
指定した範囲の数字を一定の間隔で分割しています。
下記の場合0から2までの数字を5分割して配列に埋め込んでいます。
linspace( 開始する数字, 終了する数字, 分割する数)
import numpy as np
np.linspace(0, 2, 5)
【実行結果】
array([0. , 0.5, 1. , 1.5, 2. ])
乱数で配列を作る
random.random_sample 0~1の乱数
配列または数字で指定された次元に0~1の乱数を発生させます。
※random.random、random.ranf、random.sampleのこれらはrandom.random_sampleのエイリアスです。
random.random_sample( 配列やタプルまたは数字 )
import numpy as np
np.random.random_sample((3, 3))
【実行結果】
array([[0.15490586, 0.98565728, 0.34593982],
[0.55123632, 0.58481885, 0.59000275],
[0.5701705 , 0.63988713, 0.22034551]])
random.rand 0~1の乱数
指定された次元に0~1の乱数を発生させます。
random.random_sampleとの違いは引数の与え方です。
random.rand( d )
d | (オプション)数字(次元数) |
import numpy as np
np.random.rand(3,2)
【実行結果】
array([[0.01528079, 0.893044 ],
[0.53571373, 0.58950037],
[0.53957641, 0.76926684]])
random.normal 正規分布に従う乱数
指定した配列または数字に正規分布に従う乱数を埋め込みます。
random.normal( 平均, 標準偏差, 配列または数字 )
import numpy as np
np.random.normal(0, 1, (2, 2))
【実行結果】
array([[-0.11694555, -0.57693902],
[-1.55712622, 0.23347421]])
random.randint 指定した範囲の乱数
指定した範囲の値で乱数を発生させる。
random.randint( low, high=None, size=None )
low | 開始する範囲の数字 |
high | (オプション)終了する範囲の数字 |
size | (オプション)次元のサイズ |
import numpy as np
np.random.randint(0, 10, (3, 3))
【実行結果】
array([[8, 9, 4],
[3, 4, 5],
[3, 9, 0]])
random.randn 標準正規分布の乱数
標準正規分布に従った乱数を発生させる。
random.randn( 配列または数字 )
import numpy as np
np.random.randn(2,3)
【実行結果】
array([[ 1.36458197, 0.40702114, -0.64840371],
[ 1.9567457 , 0.20099753, -1.24822658]])
random.choice 要素を選択
配列やリスト・タプルの中から要素をランダムに選択します。
random.choice( a, size=None, replace=True, p=None )
a | 配列 |
size | (オプション)選択する個数 |
replace | (オプション)重複のあり(True)・なし(False) |
p | (オプション)配列の選択確率を指定。デフォルトは一様分布。合計が1になるようにする。 |
import numpy as np
x = np.array([1,3,5,7,9,11,13])
a = np.random.choice(x)
b = np.random.choice(x,2)
print(a)
print(b)
【実行結果】
13
[11 7]
【例】確率を指定して配列から選択
import numpy as np
x = np.array([1,3,5,7,9,11,13])
a = np.random.choice( x, 3, replace=False, p=[0.1, 0.1, 0.3, 0.1, 0.1, 0.2, 0.1] )
print(a)
【実行結果】
[ 5 11 9]
random.uniform 指定範囲の乱数
指定した範囲で乱数を作成します。
random.uniform( low, high, size )
low | (オプション)指定範囲の下限(初期値:0) |
high | 指定範囲の上限(初期値:1) |
size | (オプション)出力する配列のサイズ |
import numpy as np
print(np.random.uniform())
print(np.random.uniform(3))
print(np.random.uniform(2, 6))
print(np.random.uniform(1, 3, 3))
print(np.random.uniform(4, 5, [3,2]))
【実行結果】
0.2065014712443649
2.131755758713982
5.047370401908152
[2.84762668 2.55190818 2.96576773]
[[4.71231474 4.91989518]
[4.96528695 4.59754732]
[4.11576042 4.26972255]]
random.multivariate_normal 共分散の乱数
共分散に基づいた乱数を作成します。
random.multivariate_normal( mean, cov, size=None )
mean | 次元毎の平均値 |
cov | 共分散行列(配列) |
size | (オプション)作成する乱数の数 |
※共分散行列は次のように表されます。
\begin{equation*}
\left[
\begin{matrix}
S_{xx} & S_{xy} \\
S_{xy} & S_{yy} \
\end{matrix}
\right]
\end{equation*}
\begin{equation*}
S_{xx},S_{yy}・・・x,y各々の分散 \\
S_{xy}・・・xとyの共分散
\end{equation*}
import numpy as np
import matplotlib.pyplot as plt
mean = [0, 0]
cov = [[1, 2],
[2, 5]]
X = np.random.multivariate_normal(mean, cov, 50)
plt.scatter(X[:,0], X[:,1]);
【実行結果】

同じ乱数を作る
random.seed
乱数を登録し同じ乱数を発生させる(乱数の初期化)。
random.seed( 数字 )
※数字の値は任意
※最初に設定した数字と後に初期化する数字は同じにする必要がある
import numpy as np
np.random.seed(0)
【例】
import numpy as np
np.random.seed(0) # 同じ乱数発生させる為に0を設定
np.random.randint(0, 10, (3, 3)) # 乱数を発生させる
array([[5, 0, 3],
[3, 7, 9],
[3, 5, 2]])
np.random.randint(0, 10, (3, 3)) # もう一度乱数を発生させる
array([[4, 7, 6],
[8, 8, 1],
[6, 7, 7]])
np.random.seed(0) # さきほど設定した0で初期化
np.random.randint(0, 10, (3, 3)) # 再度乱数を発生
# 最初と同じ結果で初期化されました
array([[5, 0, 3],
[3, 7, 9],
[3, 5, 2]])
random.RandomState
指定した番号の乱数をインスタンス化して乱数を発生される。
random.RandomState( 数字 )
※数字の値は任意
import numpy as np
r1 = np.random.RandomState(1234)
r1.randint(0,10,3)
【実行結果】
array([3, 6, 5])
seedとRandomStateの違い
RandomStateはインスタンス化して個々に乱数を発生させることができるが、seedはできない。
【例】import numpy as np
r2 = np.random.seed(1234)
r2.randint(0,10,3)
【実行結果】
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-23-c997174b2cf2> in <module>
2
3 r2 = np.random.seed(1234)
----> 4 r2.randint(0,10,3)
AttributeError: 'NoneType' object has no attribute 'randint'
その他の配列作成
eye
指定した数字の単位行列を生成する。
eye( 数字 )
import numpy as np
np.eye(3)
【実行結果】
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
empty
指定した配列または数字に初期化されてない値を埋め込みます。メモリに既に残っている数字が挿入されます。
empty( 配列または数字 )
import numpy as np
np.empty(3)
【実行結果】
array([1., 1., 1.])
asarray
ndarray引数にasarrayで配列を作成すると元の配列と作成された配列が同期される。
asarray( ndarray )
import numpy as np
a = np.array([1,2,3])
b = np.asarray(a)
# 元の配列に変更を加える
a[0] = 2
# 同期されていることが確認
print(a)
print(b)
【実行結果】
[2 2 3]
[2 2 3]
格子点の作成
meshgrid
マトリクス座標の格子点を作成します。
import numpy as np
x = np.array([0,4])
y = np.array([0,3,6])
xv, yv = np.meshgrid(x,y)
xv,yv
【実行結果】
(array([[0, 4],
[0, 4],
[0, 4]]),
array([[0, 0],
[3, 3],
[6, 6]]))
meshgrid解説
meshgridの、xで指定した値、yで指定した値はそれぞれ下図のようになります。

mgrid
meshgridを返すnd_gridインスタンス。meshgrid同様にマトリクス座標の格子点を作成します。
import numpy as np
np.mgrid[0:4:2,0:9:3]
【実行結果】
array([[[0, 0, 0],
[2, 2, 2]],
[[0, 3, 6],
[0, 3, 6]]])
mgrid解説
mgridのxで指定した値[0:4:2]は、0と2になります。
mgridのyで指定した値[0:9:3]は、0と3と6になります。
値が配置される方向は下図のようになります。

こちらのサイトを参考にしました。