LoginSignup
2
5

More than 5 years have passed since last update.

[Python]Numpy配列を使った様々なデータ処理

Last updated at Posted at 2016-10-23

準備

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)

左から右に大きくなっていくことがわかります

スクリーンショット 2016-10-23 10.52.06.png

plt.imshow(dy)

上から下に大きくなっていくことがわかります

スクリーンショット 2016-10-23 10.56.33.png

複雑な計算をしてみる

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

スクリーンショット 2016-10-23 11.02.04.png

配列を使った様々なデータ処理

実験用の配列を準備

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
2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5