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)#配列の中に任意の要素が存在するか判定する
それでは、よろしくお願い致します。
- おまじない
- グリッドを作る
- カラープロットする
- 条件に合った要素を探す(where関数)
- 様々な統計処理
- anyとall
- sort(arrayを並び替える)
- unique(重複を取り除く)
- in1d(配列の中に任意の要素が存在するか判定する)
おまじない
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)")# タイトルを付ける >>>
[補足] 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回はこちら。
それじゃー、また。
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)
よろしくお願い致します。
- おまじない
- 平方根を計算する
- 自然対数の底eの累乗
- 正規分布に従う乱数を作る
- arrayの足し算
- arrayの引き算
- arrayの掛け算
- arrayの割り算
- 大きさを比較して各要素の大きいほうを返す
- その他の演算子
おまじない
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回はこちら。
それじゃー、また。
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回はこちら
それじゃー、また。
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回はこちら。
それじゃー、また。
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回はこちら。
それじゃー、また。
numpy入門1_「arrayを作る。」
こんにちは、ワタルです。
さっと見て、「あぁそうだったそうだった」と確認できるハンドブックのような存在を目指して、 全10回前後で、numpy入門という連載を開始したいと思います。
今回は第一回目です。 よろしくお願いします。
- numpyをimportする
- listからarrayに変換する
- arrayを表示する
- arrayをコピーする
- 行列の大きさを指定して、多次元のarrayを作る。
- 複数のlistを使って、多次元のarrayを作る。
- arrayのサイズを調べる
- arrayのデータ型を調べる
- すべての要素が0のarrayを作る
- すべての要素が1のarrayを作る
- 空のarrayを作る
- 単位行列のarrayを作る
- 等差数列のarrayを作る(arange関数)
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回はこちら。
それじゃー、また。