数値\(x\)の絶対値 \(|x|\)を求めるには、主に以下の関数を用います。
- 組み込み関数:abs(x)
- mathモジュール:math.fabs(x)
また、配列(ndarray)の各要素を絶対値にすることもできます。この場合は、
- numpyモジュール: numpy.abs(x) or numpy.absolute(x)
を使うのが便利です。
今回は、これらの使い方についてまとめました。
確認した環境
- OS: Ubuntu16.04LTS
- Python3.7.2@Anaconda
abs(), math.abs()の使いかた
数値\(x\)の絶対値\(|x|\)は、冒頭にも述べたように
- 組み込み関数: abs(x)
- mathモジュール: math.fabs(x)
を使います。以下に、それぞれの違いが分かるように表にしてみました。
引数xの型(数値型) | 返り値の型 | |
---|---|---|
abs(x) | 整数(int)型 | 整数(int)型 |
浮動小数点(float)型 | 浮動小数点(float)型 | |
複素数(complex)型 | magnitude (※) | |
math.fabs(x) | 整数(int)型 | 浮動小数点(float)型 |
浮動小数点(float)型 | 浮動小数点(float)型 | |
複素数は非対応 | – |
※複素数: \(a+bj\)とした場合、magunitute = \(\sqrt{a^2+b^2}\)と表します。
この表に示す通り、それぞれの違いは、
- 整数型の返り値の型
- 複素数型に対応しているかどうか
となります。それぞれの使いかたの具体例を以下に示します。
組込み関数:abs(x)の具体例
- 入力が整数(int)型
# int型 → 返り値もint型
>>> abs(-2)
2
>>> abs(2)
2
# float型
>>> abs(1.23)
1.23
>>> abs(-1.23)
1.23
# complex型
>>> abs(1+2j)
2.23606797749979
>>> abs(-1-2j)
2.23606797749979
mathモジュール:math.fabs(x)の具体例
- 入力が整数(int)型
>>> import math
# int型 → 返り値はfloat型
>>> math.fabs(2)
2.0
>>> math.fabs(-2)
2.0
# float型
>>> math.fabs(1.23)
1.23
>>> math.fabs(-1.23)
1.23
配列の各要素の絶対値を取得する場合
配列の各要素の絶対を計算する場合は、
- numpyモジュールの関数:numpy.absolute()またはnumpy.abs()
を使います。この関数は配列ndarrayを引数にとり、その各要素の絶対値を返します。
尚、numpy.abs()はnumpy.absolute()のショートカットで、同じものです。本記事では以降、この短い方を使っていきます。
使い方の具体例
- 入力が整数(int)型の配列
>>> import numpy as np
# 整数型の配列 → 返り値も整数型の配列
>>> d = np.array([-1, -2, -3])
>>> np.absolute(d)
array([1, 2, 3])
# どちらも同じ関数です
>>> np.abs(d)
array([1, 2, 3])
# 浮動小数点型の配列
>>> d = np.array([-1.2, -2.3, -3.4])
>>> np.abs(d)
array([1.2, 2.3, 3.4])
# 複素数型の配列
>>> d = np.array([1.2+3.4j, -1.2-3.4j, -3.4-5.6j])
>>> np.abs(d)
array([3.60555128, 3.60555128, 6.55133574])
その他の特徴
- np.abs()はスカラー量(数値)を引数に取ることも出来ます。その場合は入力と同じ型の数値型が返ります。
# 整数型
>>> np.abs(-1)
1
# 浮動小数点型
>>> np.abs(-1.23)
1.23
# 複素数型
>>> np.abs(-1-2j)
2.23606797749979
# リストを引数に設定
>>> a = [-1, -2, -3]
>>> np.abs(a)
array([1, 2, 3])
この挙動はabs()やmath.fabs()では見られず、TypeErrorが返ります。
# リストを引数に設定
>>> a = [-1, -2, -3]
>>> abs(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: bad operand type for abs(): 'list'
>>> math.fabs(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be real number, not list
>>> d = np.array([-1, -2, -3])
>>> abs(d)
array([1, 2, 3])
# 配列のサイズが2以上だとTypeError
>>> d = np.array([-1, -2, -3])
>>> math.fabs(d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: only size-1 arrays can be converted to Python scalars
但し、配列のサイズが1の場合はきちんと計算されます。
>>> d = np.array([-1])
>>> math.fabs(d)
1.0
まとめ
今回は、Pythonで絶対値を求める関数の使いかたや特徴についてまとめました。
- 数値の場合: abs(x)とmath.fabs(x)
- 配列の場合: numpy.absolute(), or numpy.abs()