【Python】絶対値の計算方法について(abs, math.fabs, numpy.abs)

数値\(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|\)は、冒頭にも述べたように

を使います。以下に、それぞれの違いが分かるように表にしてみました。

引数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)型
  • # float型
    >>> abs(1.23)
    1.23
    >>> abs(-1.23)
    1.23
  • 入力が複素数(complex)型
  • # 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)型
  • # float型
    >>> math.fabs(1.23)
    1.23
    >>> math.fabs(-1.23)
    1.23

配列の各要素の絶対値を取得する場合

配列の各要素の絶対を計算する場合は、

を使います。この関数は配列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])
  • 入力が浮動小数点(float)型の配列
  • # 浮動小数点型の配列 
    >>> d = np.array([-1.2, -2.3, -3.4])
    
    >>> np.abs(d)
    array([1.2, 2.3, 3.4])
  • 入力が複素数(complex)型の配列
  • # 複素数型の配列
    >>> 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
  • リストを引数に設定しても、(それを配列ndarrayに変換して?)計算してくれます!
  • # リストを引数に設定
    >>> 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
  • 配列ndarrayは組み込み関数abs()でも使えます。(ブロードキャスト機能か)
  • >>> d = np.array([-1, -2, -3])
    
    >>> abs(d)
    array([1, 2, 3])
  • math.abs()だとTypeErrorとなります。
  • # 配列のサイズが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()

Learn more...

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

[Sponsor link]