筋肉で解決しないために。

日々出会うモノに対する考察をしたり、主に以下のテーマに関して書いています。 データサイエンス/人工知能/AI/機械学習/DeepLearning/Python//数学/統計学/統計処理

numpy入門6_「arrayを使ったデータ処理」

こんにちは、ワタルです。

さっと見て、「あぁそうだったそうだった」と確認できるハンドブックのような存在を目指して。

第6回目、「arrayを使ったデータ処理」です。

今回では、以下の関数を使えるようになることが目標です。

dx,dy=np.meshgrid(points,points)#グリッドをつくる
plt.imshow(z,cmap="bwr")#カラープロットする
plt.colorbar()#カラーバーを示す
plt.title("z = sin(x)+sin(y)")#図にタイトルをつける
np.where(arr < 0,0,arr)#条件に合った要素を探す
arr.sum()#合計
arr.mean()#平均
arr.std()#標準偏差
arr.var()#分散
bool_arr.any()#1つでもTrueがあるか判定する
bool_arr.all()# 全部Trueかを判定する
arr_s = np.sort(arr)#小さい順に並び替える
np.unique(countries)#重複を取り除く
np.in1d([x,y,z],countries)#配列の中に任意の要素が存在するか判定する

それでは、よろしくお願い致します。

おまじない

import numpy as np
from numpy.random import randn
import matplotlib.pyplot as plt
%matplotlib inline

グリッドを作る

points = np.arange(-5,5,0.01)#arrayをつくる
dx,dy=np.meshgrid(points,points)
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]])
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]])

np.meshgridの解説

簡単な配列でmeshgrid関数を見てみます。

x3 = np.arange(3)
y4 = np.arange(4)
x3

>>>
array([0, 1, 2])
y4

>>>
array([0, 1, 2, 3])

ここでmeshgridしてみます。

dx3,dy4=np.meshgrid(x3,y4)
dx3

>>>
array([[0, 1, 2],
       [0, 1, 2],
       [0, 1, 2],
       [0, 1, 2]])
#dx3はx3という配列が、y4の要素数だけ、行方向に増えたことがわかります
dy4

>>>
array([[0, 0, 0],
       [1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])
#dy4はy4という配列が、x3の要素数だけ、列方向に増えたことがわかります

カラープロットする

先で計算した、dx,dyをsin関数で少しいじってカラープロットしてみます。

z = (np.sin(dx) + np.sin(dy))# sin関数で少し計算

plt.imshow(z,cmap="bwr")#カラープロットする

plt.colorbar()#カラーバーを出す

plt.title("z = sin(x)+sin(y)")# タイトルを付ける

>>>

f:id:watarumon:20180611121507p:plain

[補足] plt.imshowの引数に「cmap="bwr"」を指定していますが、これはカラープロットの色の指定を意味します。 様々な種類がありますので、詳細はこちらを参照願います。 https://matplotlib.org/examples/color/colormaps_reference.html

条件に合った要素を探す(where関数)

1次元配列に対して

#arrayをつくる
A = np.array([1,2,3,4])
B = np.array([100,200,300,400])
TrFa = np.array([True,True,False,False])

#numpy.whereを使う
answer = np.where(TrFa,A,B)
answer

>>>
array([  1,   2, 300, 400])
#AとBに対して、TrueならA、FalseならBの配列を返していることがわかります

2次元配列に対して

arr = randn(5,5)#5×5の配列をつくる
arr

>>>
array([[ 1.82071799, -1.03664279,  0.50066637,  1.93569289,  0.38661873],
       [-1.42820125, -0.1864199 , -1.57738425, -0.38882376,  0.21758193],
       [ 0.80581171, -0.12401239, -1.38564015,  1.06400648, -0.86345109],
       [-0.61646801,  3.29358592, -0.5654698 ,  1.77814005,  0.19415474],
       [-0.31093902,  0.53917403,  0.85159456, -0.63927471,  0.94545253]])
np.where(arr < 0,0,arr)
#条件式に合致すれば0を、それ以外は元の値を返していることがわかります

>>>
array([[1.82071799, 0.        , 0.50066637, 1.93569289, 0.38661873],
       [0.        , 0.        , 0.        , 0.        , 0.21758193],
       [0.80581171, 0.        , 0.        , 1.06400648, 0.        ],
       [0.        , 3.29358592, 0.        , 1.77814005, 0.19415474],
       [0.        , 0.53917403, 0.85159456, 0.        , 0.94545253]])

様々な統計処理

arr = np.array([[1,2,3],[4,5,6],[7,8,9]])#arrayをつくる
arr

>>>
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

sum(合計)

arr.sum()

>>>
45
arr.sum(0)#合計する列を指定出来る

>>>
array([12, 15, 18])

mean(平均)

arr.mean()

>>>
5.0

std(標準偏差)

arr.std()

>>>
2.5819888974716112

var(分散)

arr.var()

>>>
6.666666666666667

anyとall

bool_arr = np.array([True,False,True]) #arrayをつくる
bool_arr.any()#1つでもTrueがあるか判定する

>>>
True
bool_arr.all()# 全部Trueかを判定する

>>>
False

sort(arrayを並び替える)

arr = randn(5)#ランダムなarrayをつくる
arr

>>>
array([ 0.75681233,  1.41480162,  0.03750724, -0.18838668,  0.16019609])
arr_s = np.sort(arr)#小さい順に並び替える
arr_s

>>>
array([-0.18838668,  0.03750724,  0.16019609,  0.75681233,  1.41480162])
arr_r = np.sort(arr)[::-1]#大きい順に並び替える
arr_r

>>>
array([ 1.41480162,  0.75681233,  0.16019609,  0.03750724, -0.18838668])

unique(重複を取り除く)

countries = np.array(['France', 'Japan', 'USA', 'Russia','USA','Mexico','Japan'])#arrayをつくる
np.unique(countries)

>>>
array(['France', 'Japan', 'Mexico', 'Russia', 'USA'], dtype='<U6')

in1d(配列の中に任意の要素が存在するか判定する)

np.in1d(['France','USA','Sweden'],countries)

>>>
array([ True,  True, False], dtype=bool)
#np.in1d(x,y)では、xの各要素がyに存在するかを判定できていることがわかります

第7回はこちら。

watarumon.hatenablog.com

それじゃー、また。