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


#### 準備

0から10まで11個の要素をもったarrayを作る

```ipython
arr = np.arange(11)
arr

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

これを使って計算していきます

##### 配列それぞれ平方根を求める

```ipython
np.sqrt(arr)

array([ 0.        ,  1.        ,  1.41421356,  1.73205081,  2.        ,
        2.23606798,  2.44948974,  2.64575131,  2.82842712,  3.        ,
        3.16227766])
```

##### 自然対数の底eを累乗したい値を求める

eの何乗かが求められます

```ipython
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個返却

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

##### ２つの正規分布を加算

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

```ipython
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のそれぞれの要素で大きい方を返却

```ipython
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配列を使ったデータ処理

#### グラフの描画する準備

```ipython
import matplotlib.pyplot as plt
%matplotlib inline
```

#### 準備

-5から5までの0.01刻みの配列

```ipython
points = np.arange(-5,5,0.01)
```


```ipython
dx, dy = np.meshgrid(points,points)
```

-5から5まで0.01刻みで大きくなっていく

```ipython
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とは逆のもの

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

これらを描画してみる

```ipython
plt.imshow(dx)
```

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

![スクリーンショット 2016-10-23 10.52.06.png](https://qiita-image-store.s3.amazonaws.com/0/3962/53c7378b-ae7d-58d5-351d-3a6e3d6ee949.png "スクリーンショット 2016-10-23 10.52.06.png")

```ipython
plt.imshow(dy)
```

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

![スクリーンショット 2016-10-23 10.56.33.png](https://qiita-image-store.s3.amazonaws.com/0/3962/29e3bb0b-58ef-5085-b1f0-2dc7d753eb8d.png "スクリーンショット 2016-10-23 10.56.33.png")

#### 複雑な計算をしてみる

dxとdyをそれぞれ三角関数sinを使って足し合わせたもの

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

描画してみる

```ipython
plt.imshow(z)
plt.colorbar()
```

![スクリーンショット 2016-10-23 11.02.04.png](https://qiita-image-store.s3.amazonaws.com/0/3962/f27507d5-2515-71fe-64c0-0d94e1ff410c.png "スクリーンショット 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
```