準備
0から10まで11個の要素をもったarrayを作る
arr = np.arange(11)
arr
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
これを使って計算していきます
配列それぞれ平方根を求める
np.sqrt(arr)
array([ 0. , 1. , 1.41421356, 1.73205081, 2. ,
2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. ,
3.16227766])
自然対数の底eを累乗したい値を求める
eの何乗かが求められます
np.exp(arr)
array([ 1.00000000e+00, 2.71828183e+00, 7.38905610e+00,
2.00855369e+01, 5.45981500e+01, 1.48413159e+02,
4.03428793e+02, 1.09663316e+03, 2.98095799e+03,
8.10308393e+03, 2.20264658e+04])
正規分布に従う乱数を返してくれる関数
平均が0、分散が1に従う分布からランダム10個返却
A = np.random.randn(10)
A
array([ 1.58618601, 1.04344798, -1.27389788, 0.96399318, -0.01948978,
1.74715498, -1.74566889, 0.22554911, -0.89309691, 0.64486646])
2つの正規分布を加算
B = np.random.randn(10)
B
array([ 0.24123105, -1.68669802, 1.89703691, 0.13287126, -1.77419931,
-1.1523576 , -0.23598222, 0.03143082, 1.86305367, 0.21272997])
np.add(A,B)
array([ 1.82741706, -0.64325005, 0.62313903, 1.09686444, -1.79368909,
0.59479738, -1.98165111, 0.25697993, 0.96995677, 0.85759643])
各要素の大きい方を返却
AとBのそれぞれの要素で大きい方を返却
np.maximum(A,B)
array([ 1.58618601, 1.04344798, 1.89703691, 0.96399318, -0.01948978,
1.74715498, -0.23598222, 0.22554911, 1.86305367, 0.64486646])
Numpy配列を使ったデータ処理
グラフの描画する準備
import matplotlib.pyplot as plt
%matplotlib inline
準備
-5から5までの0.01刻みの配列
points = np.arange(-5,5,0.01)
dx, dy = np.meshgrid(points,points)
-5から5まで0.01刻みで大きくなっていく
dx
array([[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
...,
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99]])
dxとは逆のもの
dy
array([[-5. , -5. , -5. , ..., -5. , -5. , -5. ],
[-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],
[-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],
...,
[ 4.97, 4.97, 4.97, ..., 4.97, 4.97, 4.97],
[ 4.98, 4.98, 4.98, ..., 4.98, 4.98, 4.98],
[ 4.99, 4.99, 4.99, ..., 4.99, 4.99, 4.99]])
これらを描画してみる
plt.imshow(dx)
左から右に大きくなっていくことがわかります
plt.imshow(dy)
上から下に大きくなっていくことがわかります
複雑な計算をしてみる
dxとdyをそれぞれ三角関数sinを使って足し合わせたもの
z = (np.sin(dx) + np.sin(dy))
z
array([[ 1.91784855e+00, 1.92063718e+00, 1.92332964e+00, ...,
-8.07710558e-03, -5.48108704e-03, -2.78862876e-03],
[ 1.92063718e+00, 1.92342581e+00, 1.92611827e+00, ...,
-5.28847682e-03, -2.69245827e-03, -5.85087534e-14],
[ 1.92332964e+00, 1.92611827e+00, 1.92881072e+00, ...,
-2.59601854e-03, -5.63993297e-14, 2.69245827e-03],
...,
[ -8.07710558e-03, -5.28847682e-03, -2.59601854e-03, ...,
-1.93400276e+00, -1.93140674e+00, -1.92871428e+00],
[ -5.48108704e-03, -2.69245827e-03, -5.63993297e-14, ...,
-1.93140674e+00, -1.92881072e+00, -1.92611827e+00],
[ -2.78862876e-03, -5.85087534e-14, 2.69245827e-03, ...,
-1.92871428e+00, -1.92611827e+00, -1.92342581e+00]])
描画してみる
plt.imshow(z)
plt.colorbar()
配列を使った様々なデータ処理
実験用の配列を準備
A = np.array([1,2,3,4])
B = np.array([1000,2000,3000,4000])
条件にあった値を洗い出す
condition = np.array([True, True, False, False])
answer = [(a if cond else b) for a,b,cond in zip(A,B,condition)]
answer
[1,2,3000,4000]
リストの内包表記は速度が遅いということと多次元に対応できない欠点があるので、
速度を上げて、多次元の配列に対応させる
answer2 = np.where(condition, A, B)
answer2
array([ 1, 2, 3000, 4000])
np.whereは2次元の配列にも使える
5x5の標準正規分布から取ってきたランダムな値を作る
from numpy.random import randn
arr = randn(5,5)
arr
array([[-1.00937032, 1.23348883, 0.1267633 , 0.6637059 , 0.96770594],
[ 0.29606946, -0.63752513, 0.97016509, 0.42688117, -2.38404912],
[ 1.0549739 , -0.12309795, -0.22361239, 1.91466958, -0.35711905],
[ 0.22359192, -1.60330203, 1.23216518, -0.99154743, 0.52558739],
[-1.11301393, 0.1911824 , 1.14858049, -0.19331843, 0.42102773]])
これらの値に対して0より小さければ0、そうでなければ元の値を返すようにしてみる
np.where(arr < 0, 0, arr)
array([[ 0. , 1.23348883, 0.1267633 , 0.6637059 , 0.96770594],
[ 0.29606946, 0. , 0.97016509, 0.42688117, 0. ],
[ 1.0549739 , 0. , 0. , 1.91466958, 0. ],
[ 0.22359192, 0. , 1.23216518, 0. , 0.52558739],
[ 0. , 0.1911824 , 1.14858049, 0. , 0.42102773]])
負の数はすべて0になります。
すごくシンプルに書けますね。
他のnumpyの関数をみてみる
準備
arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
sum関数
合計値の計算
arr.sum()
45
sum関数はどの軸に計算をすすめるか支持を出せる
たとえば引数0にすると行方向に計算、引数1にすると列方向に計算
arr.sum(0)
array([12, 15, 18])
arr.sum(1)
array([ 6, 15, 24])
mean関数
平均値
arr.mean()
5.0
std関数
標準偏差
arr.std()
2.5819888974716112
var関数
分散
arr.var()
6.666666666666667
numpyの便利な関数 any,all
準備
bool_arr = np.array([True, False, True])
bool_arr
array([ True, False, True], dtype=bool)
any関数
一つでもtrueがあればTrueを返却
bool_arr.any()
True
all関数
すべてがtrueであればTrueを返却
bool_arr.all()
False