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

日々出会うモノに対する考察をしたり、主に以下のテーマに関して書いています。 データサイエンス/人工知能/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

それじゃー、また。

numpy入門5_「arrayと計算のための関数」

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

第5回目、「arrayと計算のための関数」です。 今回では、以下の関数を使えるようになることが目標です。

np.sqrt(arr)
np.exp(arr)
np.random.randn(n)
np.add(arr,arr2)
np.subtract(arr,arr2)
np.multiply(arr,arr2)
np.divide(arr,arr2)
np.maximum(arr,arr2)
np.minimum(arr,arr2)

よろしくお願い致します。

おまじない

import numpy as np
arr = np.arange(11)#arrayを作る
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の累乗

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])

正規分布に従う乱数を作る

A = np.random.randn(10)
A

>>>
array([ -3.11107882e-01,  -2.39068257e-01,  -5.28049925e-01,
        -5.47855008e-01,  -1.22663428e+00,  -1.48924670e+00,
        -5.73344030e-01,  -8.21385630e-01,   7.93016177e-01,
         4.13389788e-04])

arrayの足し算

arr = np.arange(11)#arrayを2つ作る
arr2 = np.arange(11)
np.add(arr,arr2)

>>>
array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18, 20])

arrayの引き算

np.subtract(arr,arr2)

>>>
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

arrayの掛け算

np.multiply(arr,arr2)

>>>
array([  0,   1,   4,   9,  16,  25,  36,  49,  64,  81, 100])

arrayの割り算

np.divide(arr,arr2)

>>>
array([nan,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])
#0での割り算が起こっているので要注意

大きさを比較して各要素の大きいほうを返す

np.maximum(A,B)
#小さいほうならnp.minimum(A,B)

>>>
array([ -3.11107882e-01,   1.47650544e-01,  -5.28049925e-01,
         1.39597633e+00,  -3.13646087e-01,   1.42949959e+00,
         1.56775535e+00,  -3.70853362e-01,   7.93016177e-01,
         4.13389788e-04])

その他の演算子

numpyには、非常に数多くの演算子があり、ここでは記述しきれませんので、 詳しくは、numpyのドキュメントをご参照願います。

第6回はこちら。

watarumon.hatenablog.com

それじゃー、また。

numpy入門4_「行列の入れ替えと基本行列計算」

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

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

第4回目、「行列の入れ替えと基本行列計算」です。

よろしくお願い致します。

おまじない

import numpy as np

転置行列を作る(行と列の入れ替え)

arr = np.arange(9).reshape((3,3))#arrayを作る
arr

>>>
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
arr.T #行列の転置

>>>
array([[0, 3, 6],
       [1, 4, 7],
       [2, 5, 8]])
arr.transpose()#transposeメソッドでも" .T "と同じく、行列の転置ができる

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

引き数をとって、行列を入れ替える。

2次元配列の場合(0は行、1は列)

arr.transpose((0,1))

>>>
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
#行と列が入れ替わる
arr.transpose((1,0))

>>>
array([[0, 3, 6],
       [1, 4, 7],
       [2, 5, 8]])
#swapaxesでも行列を入れ替えができる。
#transposeと使い方は一緒。
arr.swapaxes(1,0)

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

3次元配列の場合。

arr2 = np.arange(24).reshape(4,3,2) # 4×3×2の3次元配列。
arr2

>>>
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5]],

       [[ 6,  7],
        [ 8,  9],
        [10, 11]],

       [[12, 13],
        [14, 15],
        [16, 17]],

       [[18, 19],
        [20, 21],
        [22, 23]]])
arr2.transpose(2,1,0)# 2×3×4の3次元配列へ。

>>
array([[[ 0,  6, 12, 18],
        [ 2,  8, 14, 20],
        [ 4, 10, 16, 22]],

       [[ 1,  7, 13, 19],
        [ 3,  9, 15, 21],
        [ 5, 11, 17, 23]]])

行列の積(dot)

np.dot(arr.T, arr)

>>>
array([[45, 54, 63],
       [54, 66, 78],
       [63, 78, 93]])
#ちなみにdotは要素の掛け算ではありません。
#掛け算を試してみると。
arr.T * arr

>>>
array([[ 0,  3, 12],
       [ 3, 16, 35],
       [12, 35, 64]])
#np.dot(arr.T, arr)とは違うことがわかります

第5回はこちら

watarumon.hatenablog.com

それじゃー、また。

numpy入門3_「arrayを添え字で参照する」

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

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

第3回目、「arrayを添え字で参照する」です。

よろしくお願い致します。

おまじない

import numpy as np

添え字を使ったアクセス(1次元配列)

1点だけ指定

arr = np.arange(0,11)#arrayを作る
arr

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

>>>
8

スライスを用いて、arrayを表示

arr[1:5]

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

スライスを用いて、arrayに代入

arr[0:5]=100
arr

>>>
array([100, 100, 100, 100, 100,   5,   6,   7,   8,   9,  10])

スライスを用いてすべての要素を指定

arr = np.arange(0,11)#arrayを作る
arr = np.arange(0,11)
arr

>>>
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
slice_of_arr = arr[0:6]
slice_of_arr

>>>
array([0, 1, 2, 3, 4, 5])
slice_of_arr[:]=99
slice_of_arr

>>>
array([99, 99, 99, 99, 99, 99])
arr#最初のarrayを確認すると。

>>>
array([99, 99, 99, 99, 99, 99,  6,  7,  8,  9, 10])

添え字を使ったアクセス(2次元配列)

arr_2d = np.array(([5,10,15],[20,25,30],[35,40,45])) #arrayを作る。
arr_2d

>>>
array([[ 5, 10, 15],
       [20, 25, 30],
       [35, 40, 45]])

行の指定

arr_2d[1]

>>>
array([20, 25, 30])

行と列の指定

arr_2d[1][0] #arr[行][列] or arr[行,列]で、特定の要素を指定できる

>>>
20
arr_2d[1,0] #arr[行][列] or arr[行,列]で、特定の要素を指定できる

>>>
20

2次元arrayのスライス

arr_2d

>>>
array([[ 5, 10, 15],
       [20, 25, 30],
       [35, 40, 45]])
arr_2d[:2,1:] #arr[行][列] or arr[行,列]で、特定の要素を指定できる
#この場合では右上の2×2を指定

>>>
array([[10, 15],
       [25, 30]])

複数の行を取り出す添え字

arr_3d = np.array(([5,10,15],[20,25,30],[35,40,45],[50,55,60])) #arrayを作る。
arr_3d

>>>
array([[ 5, 10, 15],
       [20, 25, 30],
       [35, 40, 45],
       [50, 55, 60]])
arr_3d[[0,2,3]]

>>>
array([[ 5, 10, 15],
       [35, 40, 45],
       [50, 55, 60]])
arr_3d[[0,2,3],[1,1,0]]#列の指定も可能

>>>
array([10, 40, 50])
arr_3d[[3,0,2]]#順番を変えることも可能

>>>
array([[50, 55, 60],
       [ 5, 10, 15],
       [35, 40, 45]])

第4回はこちら。

watarumon.hatenablog.com

それじゃー、また。

numpy入門2_「arrayを使った計算」

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

さっと見て、「あぁそうだったそうだった」とい確認できるハンドブックのような存在を目指して。 第2回目、「arrayを使った計算」です。 よろしくお願い致します。

おまじない

import numpy as np

arrayのかけ算

arr1 = np.array([[1,2,3,4],[8,9,10,11]])# arrayを作る
arr1

>>>
array([[ 1,  2,  3,  4],
       [ 8,  9, 10, 11]])
arr1*arr1

>>>
array([[  1,   4,   9,  16],
       [ 64,  81, 100, 121]])

arrayの引き算

arr1-arr1

>>>
array([[0, 0, 0, 0],
       [0, 0, 0, 0]])

arrayの割り算

1 / arr1

>>>
array([[ 1.        ,  0.5       ,  0.33333333,  0.25      ],
       [ 0.125     ,  0.11111111,  0.1       ,  0.09090909]])

arrayの累乗(べき乗)を計算

arr1 ** 3

>>>
array([[   1,    8,   27,   64],
       [ 512,  729, 1000, 1331]])

第3回はこちら。

watarumon.hatenablog.com

それじゃー、また。

numpy入門1_「arrayを作る。」

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

さっと見て、「あぁそうだったそうだった」と確認できるハンドブックのような存在を目指して、 全10回前後で、numpy入門という連載を開始したいと思います。

今回は第一回目です。 よろしくお願いします。

numpyをimportする

import numpy as np

listからarrayに変換する

my_list1 = [1,2,3,4]
my_array1 = np.array(my_list1)

arrayを表示する

my_array1

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

arrayをコピーする

my_array2 = my_array1.copy()
my_array2

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

行列の大きさを指定して、多次元のarrayを作る。

arr = np.arange(9).reshape((3,3))
arr

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

複数のlistを使って、多次元のarrayを作る。

my_list1 = [1,2,3,4]
my_list2 = [11,22,33,44]
my_lists = [my_list1,my_list2]#listのlistを作成
my_array2 = np.array(my_lists)
my_array2

>>>
array([[ 1,  2,  3,  4],
       [11, 22, 33, 44]])

arrayのサイズを調べる

my_array2.shape

>>>
(2, 4)

arrayのデータ型を調べる

my_array2.dtype

>>>
dtype('int64')

すべての要素が0のarrayを作る

np.zeros(5)

>>>
array([ 0.,  0.,  0.,  0.,  0.])

すべての要素が1のarrayを作る

np.ones((5,5))

>>>
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.]])

空のarrayを作る

np.empty((3,4))#値が初期化されていないarrayを作る

>>>
array([[1.29251335e-311, 3.16202013e-322, 0.00000000e+000,
        0.00000000e+000],
       [0.00000000e+000, 1.58687284e-047, 1.73190845e+185,
        2.65249924e-032],
       [2.04047762e+184, 4.79803618e+174, 1.68674969e+160,
        1.40393544e+165]])

単位行列のarrayを作る

np.eye(5)

>>>
array([[ 1.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  1.]])

等差数列のarrayを作る(arange関数)

np.arange(5)#等差1の配列を作る

>>>
array([0, 1, 2, 3, 4])
np.arange(5,50,2)

>>>
array([ 5,  7,  9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37,
       39, 41, 43, 45, 47, 49])

第2回はこちら。

watarumon.hatenablog.com

それじゃー、また。