[numpy] NumPy-Mathematical functionの備忘録

普段Numpyを扱う際に確認しがちな内容が多いのでその整理のために記事にしてみました。
よく使うものが増えたら随時
最後に参考にしているURLを載せているので拙い点があればそちらも一見のほど。

# 公式のdocumentation
- [Mathematical functions - NumPy](https://numpy.org/doc/stable/reference/routines.math.html)

# 目次
- 動作環境
- 三角関数
- 符号関数

# 動作環境
|種類             |バージョン       |
|:---------------|:--------------|
|MacBook Air     |Monterey12.0.1 |
|python          |3.8.3          |
|jupyter notebook|6.0.3          |
|numpy           |1.18.5         |

まずはパッケージのインポートから
```python:
import numpy as np
```
numpyは慣例として’np’を使うそう。

# 三角関数
## 円周率　π
```python:
print(np.pi)
# 3.141592653589793
```

## 度とラジアンの変換
### 度→ラジアン
```np.radians```と```np.deg2rad```の2通りがあり、どちらを用いても同じ結果になる。
rad2degってradian to degreeの短縮になってるから直感的で分かりやすい。
```python:
print(np.radians(0))
print(np.radians(90))
print(np.radians(180))
#0.0
#1.5707963267948966
#3.141592653589793
```
```python:
print(np.deg2rad(0))
print(np.deg2rad(90))
print(np.deg2rad(180))
#0.0
#1.5707963267948966
#3.141592653589793
```

### ラジアン→度
これも```np.degrees```と```np.rad2deg```の2通りがある。
deg2radって以下略
```python:
print(np.degrees(0))
print(np.degrees(np.pi/2))
print(np.degrees(np.pi))
#0.0
#90.0
#180.0
```
```python:
print(np.rad2deg(0))
print(np.rad2deg(np.pi/2))
print(np.rad2deg(np.pi))
#0.0
#90.0
#180.0
```

## 正弦関数と逆正弦関数
では本題。正弦関数(sin)と逆正弦関数(arcsin)は各々```np.sin()```と```np.arcsin()```で表せる。
```python:
print(np.sin(np.pi/2))
print(np.sin(90))
#1.0
#0.8939966636005579
```
このように()内はradianで取るようで、もし度を用いる場合は以下のように書き換える必要がある。
```python:
print(np.sin(np.deg2rad(90)))
#1.0
```
以降では特に断りなくradianの表記でいくので悪しからず。
逆正弦関数についても
```python:
print(np.arcsin(1.0))
# 1.5707963267948966
```
で、radian表記で出力されるので注意。

## 余弦関数と逆余弦関数
余弦関数(cos)と逆余弦関数(arccos)も同様に```np.cos()```と```np.arccos()```を用いて表せる。
```python:
print(np.cos(0))
print(np.cos(np.pi))
# 1.0
# -1.0
```
```python:
print(np.arccos(0))
print(np.arccos(1))
#1.5707963267948966
#0.0
```

## 正接関数と逆正接関数
正接関数は```np.tan()```。
```python:
print(np.tan(np.pi/4))
# 0.9999999999999999
```
```np.pi```が正確に円周率を表せてない(無理数のため)のでtan45°が1にはなっていない。
逆正接関数を表す関数は2通りある。違いは、引数の入力と返り値の範囲。
一つ目は```np.arctan()```。
```python:
print(np.degrees(np.arctan([-np.inf, -1, 0, 1, np.inf])))
# [-90. -45.   0.  45.  90.]
```
このように、引数の範囲は全実数で返り値はnp.pi/2〜np.pi/2の範囲となる。
二つ目は```np.arctan2(x1, x2)```で、これは二次元極座標を表すのに便利。というのも
>Element-wise arc tangent of x1/x2 choosing the quadrant correctly.
https://numpy.org/doc/stable/reference/routines.math.htmlより
の公式の文言にあるように、二次元平面の4つの象限をx1(x座標)とx2(y座標)の分数で上手に表現できるから。
このため一つ目と異なり返り値の範囲は-pi〜piとなる。
イメージとしては(x2, x1)の位置ベクトルと原点を結んだ直線におけるx軸との偏角の正接。
```python:
print(np.degrees(np.arctan2(1, 1)))
# 45.0
print(np.degrees(np.arctan2(0, 1)))
# 0.0
```
前者は(1, 1)と原点を結ぶ直線とx軸のなす角だから45°、後者は(1, 0)でx軸上にあるから0°になっている。

# 符号関数
正の値に対して1、負の値に対して-1、0に対して0を返す関数。

符号関数は以下の形式で表す。
```python:
print(np.sign(3.45))
# 1.0
print(np.degrees(np.sign(-123)))
# -1
print(np.degrees(np.sign(0)))
# 0
print(np.degrees(np.sign(-0)))
# 0
print(np.degrees(np.sign(0.0)))
# 0.0
```
sign関数の返り値は、代入した数値の変数型に合わせて出力されることに注意。
また、-0も0も同じ0の値を返す。

# 

# 参考にしたURL
- [Numpyで三角関数(sin,cos,tan,arcsin,arccos,arctan)](https://note.nkmk.me/python-numpy-sin-con-tan/)
- [Pythonで符号に応じて1,-1,0を返すsign関数を実装](https://note.nkmk.me/python-sign-copysign/)