numpy – 四則演算、剰余を求める関数について

目次

概要

四則演算、剰余を求める関数について解説します。

numpy.add

引数を要素ごとに追加します。numpy.add(a, b)a + b と同じです。

numpy.add(x1, x2, /, out=None, *, where=True, casting="same_kind", order="K", dtype=None, subok=True[, signature, extobj]) = <ufunc "add">
引数
名前 デフォルト値
x1, x2 array_like
追加する配列。x1.shape != x2.shapeの場合、それらは共通の形状にブロードキャスト可能でなければなりません(どちらか一方の形状であっても構いません)。
返り値
名前 説明
add x1x2 の和。x1x2 の両方がスカラならば、これはスカラです。
In [1]:
import numpy as np

a = np.array([1, 2, 3])
b = np.array([1, 2, 3])
print(np.add(a, b))

print(a + b)
[2 4 6]
[2 4 6]

numpy.subtract

引数を引き算します。numpy.subtract(a, b)a - b と同じです。

numpy.subtract(x1, x2, /, out=None, *, where=True, casting="same_kind", order="K", dtype=None, subok=True[, signature, extobj]) = <ufunc "subtract">
引数
名前 デフォルト値
x1, x2 array_like
引き算される配列同士を表します。
返り値
名前 説明
y x1x2 の差、要素ごとに。x1x2 の両方がスカラならば、これはスカラです。
In [2]:
a = np.array([2, 4, 6])
b = np.array([1, 2, 3])
print(np.subtract(a, b))

print(a - b)
[1 2 3]
[1 2 3]

numpy.multiply

引数を要素ごとに乗算します。numpy.multiply(a, b)a * b と同じです。

numpy.multiply(x1, x2, /, out=None, *, where=True, casting="same_kind", order="K", dtype=None, subok=True[, signature, extobj]) = <ufunc "multiply">
引数
名前 デフォルト値
x1, x2 array_like
乗算される入力配列。
返り値
名前 説明
y x1x2 の積。x1x2 の両方がスカラならスカラを返します。x1x2 の両方がスカラならばスカラです。
In [3]:
a = np.array([2, 4, 6])
b = np.array([1, 2, 3])
print(np.multiply(a, b))

print(a * b)
[ 2  8 18]
[ 2  8 18]

numpy.divide

要素ごとの除算を計算します。numpy.divide(a, b)a / b と同じです。

numpy.divide(x1, x2, /, out=None, *, where=True, casting="same_kind", order="K", dtype=None, subok=True[, signature, extobj]) = <ufunc "true_divide">
引数
名前 デフォルト値
x1 array_like
ディバイザ配列。
x2 array_like
ディバイザの配列。
返り値
名前 説明
out x1x2 の両方がスカラならばスカラです。

x1, x2 が整数でも除算結果は浮動小数点数になります。

In [4]:
a = np.array([5, 5, 5])
b = np.array([2, 2, 3])
print(np.divide(a, b))

print(a / b)
[2.5        2.5        1.66666667]
[2.5        2.5        1.66666667]

ゼロ除算エラーとその対処法

数学的にゼロ除算は定義されないため、RuntimeWarning: divide by zero encountered という警告が発生し、ゼロ除算の結果は inf になります。

In [5]:
a = np.array([5, 5, 5])
b = np.array([2, 0, 3])
print(np.divide(a, b))
[2.5               inf 1.66666667]
<ipython-input-5-4b3b8d8af1dd>:3: RuntimeWarning: divide by zero encountered in true_divide print(np.divide(a, b))

割る数が0でない要素だけ除算を行い、割る数が0の要素はそのまま結果も0にしたい場合は、out, where 引数を使用して以下のようにします。 これは np.zeros_like(a, dtype=np.float64) で0初期化した出力先の配列を用意して、b != 0 が True の要素だけ a / b を行うという処理になります。

In [6]:
a = np.array([5, 5, 5])
b = np.array([2, 0, 3])
c = np.divide(a, b, out=np.zeros_like(a, dtype=np.float64), where=b != 0)

print(c)
[2.5        0.         1.66666667]

numpy.true_divide

要素ごとの除算を計算します。numpy.divide(a, b)a / b と同じです。

numpy.true_divide(x1, x2, /, out=None, *, where=True, casting="same_kind", order="K", dtype=None, subok=True[, signature, extobj]) = <ufunc "true_divide">
引数
名前 デフォルト値
x1 array_like
ディバイザ配列。
x2 array_like
ディバイザの配列。
返り値
名前 説明
out x1x2 の両方がスカラならばスカラです。

x1, x2 が整数でも除算結果は浮動小数点数になります。

In [7]:
a = np.array([5, 5, 5])
b = np.array([2, 2, 3])
print(np.true_divide(a, b))

print(a / b)
[2.5        2.5        1.66666667]
[2.5        2.5        1.66666667]

numpy.floor_divide

要素ごとの切り捨て除算を計算します。通常の除算との違いに注意してください。

  • numpy.divide(), numpy.true_divide(): 通常の除算。(例: 5 / 2 = 2.5)
  • numpy.floor_divide(): 余りは切り捨てる切り捨て除算。(例: 5 / 2 = 2)

numpy.floor_divide(a, b)a // b と同じです。

numpy.floor_divide(x1, x2, /, out=None, *, where=True, casting="same_kind", order="K", dtype=None, subok=True[, signature, extobj]) = <ufunc "floor_divide">
引数
名前 デフォルト値
x1 array_like
分子。
x2 array_like
分母。
返り値
名前 説明
y y = floor( x1 / x2 ) これは、x1x2 の両方がスカラならばスカラです。
In [8]:
a = np.array([5, 5, 5])
b = np.array([2, 2, 3])
print(np.floor_divide(a, b))

print(a // b)
[2 2 1]
[2 2 1]

numpy.positive

要素ごとに正の符号をとります。x == +x なので、結果的になにも演算は行いません。numpy.positive(a)+a と同じです。

numpy.positive(x, /, out=None, *, where=True, casting="same_kind", order="K", dtype=None, subok=True[, signature, extobj]) = <ufunc "positive">
引数
名前 デフォルト値
x array_like, scalar
入力配列。
返り値
名前 説明
y 返される配列またはスカラ。y = +x . x がスカラならば、これはスカラである。
In [9]:
a = np.array([5, 5, 5])
print(np.positive(a))

print(+a)
[5 5 5]
[5 5 5]

numpy.negative

要素ごとに負の符号をとります。numpy.negative(a)-a と同じです。

numpy.negative(x, /, out=None, *, where=True, casting="same_kind", order="K", dtype=None, subok=True[, signature, extobj]) = <ufunc "negative">
引数
名前 デフォルト値
x array_like, scalar
入力配列。
返り値
名前 説明
y 返される配列またはスカラ。y = -x . x がスカラならこれはスカラです。
In [10]:
a = np.array([1, 2, 3])
print(np.negative(a))

print(+a)
[-1 -2 -3]
[1 2 3]

numpy.mod

要素ごとに剰余を計算します。numpy.mod(a, b)a % b と同じです。

numpy.mod(x1, x2, /, out=None, *, where=True, casting="same_kind", order="K", dtype=None, subok=True[, signature, extobj]) = <ufunc "remainder">
引数
名前 デフォルト値
x1 array_like
被除数の配列。
x2 array_like
除数の配列。
返り値
名前 説明
y 商 floor_divide(x1, x2) の要素毎の余り。x1x2 の両方がスカラならばスカラです。
In [11]:
a = np.array([2, 3, 5])
b = np.array([3, 4, 2])
print(np.mod(a, b))

print(a % b)
[2 3 1]
[2 3 1]

numpy.fmod

要素ごとに剰余を計算します。C 言語の fmod() で計算できる剰余と同じ結果になります。

numpy.fmod(x1, x2, /, out=None, *, where=True, casting="same_kind", order="K", dtype=None, subok=True[, signature, extobj]) = <ufunc "fmod">
引数
名前 デフォルト値
x1 array_like
被除数の配列。
x2 array_like
除数の配列。
返り値
名前 説明
y x1x2 で除算したときの余り。x1x2 の両方がスカラならばスカラです。

サンプルコード

In [12]:
a = np.array([2, 3, 5])
b = np.array([3, 4, 2])
print(np.fmod(a, b))

print(a % b)
[2 3 1]
[2 3 1]

numpy.mod() と numpy.fmod() の違い

数学的には被除数 $a \in \R$ を除数 $n \in \R$ で除算した商 $q$ 及び剰余 $r$ は

$$ \begin{aligned} q &\in \Z \\ a &= nq + r \\ |r| &< |n| \end{aligned} $$

を満たすように定義されますが、これを満たす $r$ について、実装によって次のパターンがあるため、numpy.mod()numpy.fmod() の2つが用意されています。

  1. 剰余を -inf 方向の切り捨て除算の余りとして計算する方法
  2. 剰余を 0 方向の切り捨て除算の余りとして計算する方法
numpy.mod() numpy.fmod()
関係式 x1 = floor_div(x1, x2) * x2 + mod(x1, x2) x1 = true_div(x1, x2) * x2 + fix(x1, x2)
言語 Python C、C++、Java、Javascript
符号 被除数と同じ 除算と同じ
In [13]:
# x1: positive, x2: positive
print(np.mod(9, 5), np.fmod(9, 5))

# x1: negative, x2: negative
print(np.mod(-9, -5), np.fmod(-9, -5))

# x1: negative, x2: positive
print(np.mod(-9, 5), np.fmod(-9, 5))

# x1: positive, x2: negative
print(np.mod(9, -5), np.fmod(9, -5))
4 4
-4 -4
1 -4
-1 4

numpy.remainder

要素ごとに剰余を計算します。numpy.mod(a, b)a % b と同じです。 この関数は numpy.mod() のエイリアスです。

numpy.remainder(x1, x2, /, out=None, *, where=True, casting="same_kind", order="K", dtype=None, subok=True[, signature, extobj]) = <ufunc "remainder">
引数
名前 デフォルト値
x1 array_like
被除数の配列。
x2 array_like
除数の配列。
返り値
名前 説明
y 商 floor_divide(x1, x2) の要素毎の余り。x1x2 の両方がスカラならばスカラです。
In [14]:
a = np.array([2, 3, 5])
b = np.array([3, 4, 2])
print(np.remainder(a, b))
[2 3 1]

numpy.divmod

要素ごとに商と剰余を同時に計算します。

numpy.divmod(x1, x2, [out1, out2, ]/, [out=(None, None), ]*, where=True, casting="same_kind", order="K", dtype=None, subok=True[, signature, extobj]) = <ufunc "divmod">
引数
名前 デフォルト値
x1 array_like
被除数の配列。
x2 array_like
除数の配列。
返り値
名前 説明
out1 フロアー除算から得られる要素毎の商. x1x2 の両方がスカラならば、これはスカラです。
out2 階数分割からの要素ごとの余剰。x1x2 の両方がスカラーの場合、これはスカラーである。

サンプルコード

In [15]:
a = np.array([2, 3, 5])
b = np.array([3, 4, 2])
print(np.divmod(a, b))
(array([0, 0, 2]), array([2, 3, 1]))

コメント

コメントする

目次