NumPyのcos関数でコサイン(余弦)を計算する方法まとめ

NumPyのcos関数は、コサイン(余弦)を計算する関数です。

コサインについて、よく使われる説明は次のようなものです。半径1の円(「単位円」といいます)があります。この円の中心から1本の光線を、角度θで放ちます。すると、この光線は円周上の点 (a, b) に接します。この時の x座標であるa が、角度がθの時のコサインです。コサインの値は、角度0°の時の1から角度180°(πの倍数)の時の -1 までの範囲になります。そして 90°(π/2)と270°(3π/2)の間では負の値になります。

以下の図を見ると理解が進みやすいでしょう。

NumPyにはコサインに関する関数が3つあります。

  • cos: ラジアンからコサインの値を求める。
  • arccos: 単位円上のx座標から角度θ(cos**-1)を求める。
  • cosh: 双曲線上のx座標から双曲線コサイン関数の値を求める。

ここでは、これらの関数について解説します。

目次

1. cos関数

np.cos関数は、y=cos(θ) におけるy の値を計算します。まずは書式から確認しましょう。

1.1 書式

np.cos関数

書き方:

np.cos(x)
引数      解説
x    array_like  ラジアンを要素とする配列を渡します。2πは360°です。
* この他に、キーワード引数としてufunc(ユニバーサル・ファンクション)を使用可能です。具体的には、out, where, axes, axis, keepdims, casting, order, dtype, subok, signature, extobj です。しかし、これらは高度な操作を行いたい時に使うものであり、基本的には使いません。

戻り値: 

コサインの値を格納した配列
渡した配列x のそれぞれの要素ごとに計算したコサインの値を要素とする新しい配列を返します。x がスカラーの場合は、戻り値もスカラー(1つの数値のみの配列)になります。

1.2. サンプルコード

np.cos関数には、ラジアンを渡す必要があります。ラジアンでは π=180° です。そのため以下のコードはθが、0°、30°、60°、180° の時のコサインの値を求めています。

In [1]:
import numpy as np
# np.pi = π 
r = np.array([0, np.pi/6, np.pi/3, np.pi]) # np.pi = 180°
np.cos(r)
Out[1]:
array([ 1.       ,  0.8660254,  0.5      , -1.       ])

ラジアンではなく、通常の角度を数値で格納した配列をnp.cos関数に渡す時は、 ‘ * π/180 ‘ の演算を行うことでラジアンに変換することが可能です。

以下のコードで確認しましょう。

In [2]:
# 角度を格納した配列
x = np.array([0., 30, 60., 180.])

# 角度をラジアンに変換 (np.piは円周率)
r = x * np.pi/180

# cos関数にラジアンを渡す
np.cos(r)
Out[2]:
array([ 1.       ,  0.8660254,  0.5      , -1.       ])

お馴染みのコサインカーブ(または「余弦波」もしくは「シヌソイド」)を描いてみましょう。

In [3]:
import matplotlib.pylab as plt
x = np.linspace(-np.pi, np.pi, 1000)
plt.plot(x, np.cos(x))
plt.xlabel('Angle [rad]')
plt.ylabel('cos(x)')
plt.axis('tight')
plt.show()

2. arccos関数

arccos関数は、単位円上(半径1の円: x2+y2=1) のx座標から角度θ(cos**-1)を求めることができる関数です。arccosは逆三角関数におけるアークコサインのことです。

書式はnp.cos関数と同じですが、np.cos関数はラジアンを渡すのに対して、np.arccos関数は単位円上のx座標を渡します。なお、単位円上のx座標とはcosθの値のことです。

2.1. 書式

np.arccos関数

書き方:

np.arccos(x)
引数     解説
x   array_like  単位円上のx座標を要素とする配列を渡します。必然的に値は-1~1の範囲になります。
* この他に、キーワード引数としてufunc(ユニバーサル・ファンクション)を使用可能です。具体的には、out, where, axes, axis, keepdims, casting, order, dtype, subok, signature, extobj です。しかし、これらは高度な操作を行いたい時に使うものであり、基本的には使いません。

戻り値: 

角度の配列
渡した配列x のそれぞれの要素ごとに計算したコサインの逆数を要素とする新しい配列を返します。x がスカラーの場合は、戻り値もスカラー(1つの数値のみの配列)になります。

2.2. サンプルコード

それではサンプルコードを見ていきましょう。

np.arccos関数は、渡したx座標の値から、θの角度を計算しラジアンで返します。なお、単位円(円周1の円)の性質上、渡す値は-1以上1以下の範囲 である必要があります。

In [1]:
import numpy as np
# 単位円上のx座標が0.5の時
angle = np.arccos(0.5)
angle
Out[1]:
1.0471975511965976

ラジアンを角度°に変換するには、円周率np.piで割って180を掛けます。

In [2]:
 # ラジアンを角度に変換
angle/np.pi*180
Out[2]:
60.0

関数に配列を渡すと、それぞれの要素ごとにラジアンを計算します。

In [3]:
# x座標の値を格納した配列を渡す
x_cord = np.array([-1, -0.5, 0, 0.5, 1])
np.arccos(x_cord)
Out[3]:
array([3.14159265, 2.0943951 , 1.57079633, 1.04719755, 0.        ])
In [4]:
# 角度°に変換
np.arccos(x_cord)/np.pi*180
Out[4]:
array([180., 120.,  90.,  60.,   0.])

アークコサインのカーブを描いてみましょう。

In [5]:
import matplotlib.pylab as plt
x = np.linspace(-1, 1, 1000)
plt.plot(x, np.arccos(x))
plt.xlabel('Angle [rad]')
plt.ylabel('arccos(x)')
plt.axis('tight')
plt.show()

3. cosh関数

cosh関数は双曲線関数における双曲線コサイン関数(「コシャイン」または「コッシュ」)を返す関数です。双曲線コサイン関数は、cosh(x) = 1/2 * (np.exp(x) + np.exp(-x)) または np.cos(1j*x) で表すことができます。なお、双曲線とは「x2-y2=1」で定義される曲線のことです。

3.1. 書式

np.cosh関数

書き方:

np.cosh(x)
引数     解説
x   array_like  双曲線上におけるx座標を要素とする配列を渡します。
* この他に、キーワード引数としてufunc(ユニバーサル・ファンクション)を使用可能です。具体的には、out, where, axes, axis, keepdims, casting, order, dtype, subok, signature, extobj です。しかし、これらは高度な操作を行いたい時に使うものであり、基本的には使いません。

戻り値: 

双曲線サイン関数の値の配列
渡した配列x のそれぞれの要素ごとに計算した双曲線サイン関数の値を要素とする新しい配列を返します。x がスカラーの場合は、戻り値もスカラー(1つの数値のみの配列)になります。

3.2. サンプルコード

それではサンプルコードを見ていきましょう。

In [1]:
import numpy as np
np.cosh(0)
Out[1]:
1.0
In [2]:
np.cosh(np.pi*1j/2)
Out[2]:
(6.123233995736766e-17+0j)

双曲線関数コサインのカーブを描いてみましょう。

In [3]:
import matplotlib.pylab as plt
x = np.linspace(-np.pi, np.pi, 1000)
plt.plot(x, np.cosh(x))
plt.xlabel('Angle [rad]')
plt.ylabel('cosh(x)')
plt.axis('tight')
plt.show()

4. まとめ

以上が、NumPy配列のコサイン(余弦)の値を取得する関数です。それぞれ抑えておくと良いでしょう。なお、サイン(正弦)の値を取得するには、sin関数を使います。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる