概要
四則演算、剰余を求める関数について解説します。
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 | x1 と x2 の和。x1 と x2 の両方がスカラならば、これはスカラです。 |
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 | x1 と x2 の差、要素ごとに。x1 と x2 の両方がスカラならば、これはスカラです。 |
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 | x1 と x2 の積。x1 と x2 の両方がスカラならスカラを返します。x1 と x2 の両方がスカラならばスカラです。 |
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 | x1 と x2 の両方がスカラならばスカラです。 |
x1, x2
が整数でも除算結果は浮動小数点数になります。
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
になります。
a = np.array([5, 5, 5])
b = np.array([2, 0, 3])
print(np.divide(a, b))
[2.5 inf 1.66666667]
割る数が0でない要素だけ除算を行い、割る数が0の要素はそのまま結果も0にしたい場合は、out, where
引数を使用して以下のようにします。
これは np.zeros_like(a, dtype=np.float64)
で0初期化した出力先の配列を用意して、b != 0
が True の要素だけ a / b
を行うという処理になります。
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 | x1 と x2 の両方がスカラならばスカラです。 |
x1, x2
が整数でも除算結果は浮動小数点数になります。
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 ) これは、x1 と x2 の両方がスカラならばスカラです。 |
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 がスカラならば、これはスカラである。 |
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 がスカラならこれはスカラです。 |
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) の要素毎の余り。x1 と x2 の両方がスカラならばスカラです。 |
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 | x1 を x2 で除算したときの余り。x1 と x2 の両方がスカラならばスカラです。 |
サンプルコード
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つが用意されています。
- 剰余を
-inf
方向の切り捨て除算の余りとして計算する方法 - 剰余を 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 |
符号 | 被除数と同じ | 除算と同じ |
# 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) の要素毎の余り。x1 と x2 の両方がスカラならばスカラです。 |
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 | フロアー除算から得られる要素毎の商. x1 と x2 の両方がスカラならば、これはスカラです。 |
out2 | 階数分割からの要素ごとの余剰。x1 と x2 の両方がスカラーの場合、これはスカラーである。 |
サンプルコード
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]))
コメント