目次
概要
四則演算、剰余を求める関数について解説します。
引数を要素ごとに追加します。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">
引数を引き算します。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">
引数を要素ごとに乗算します。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">
要素ごとの除算を計算します。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, x2 が整数でも除算結果は浮動小数点数になります。
[2.5 2.5 1.66666667]
[2.5 2.5 1.66666667]
ゼロ除算エラーとその対処法
数学的にゼロ除算は定義されないため、RuntimeWarning: divide by zero encountered という警告が発生し、ゼロ除算の結果は inf になります。
<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 を行うという処理になります。
要素ごとの除算を計算します。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, x2 が整数でも除算結果は浮動小数点数になります。
[2.5 2.5 1.66666667]
[2.5 2.5 1.66666667]
要素ごとの切り捨て除算を計算します。通常の除算との違いに注意してください。
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">
要素ごとに正の符号をとります。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">
要素ごとに負の符号をとります。numpy.negative(a) は -a と同じです。
numpy.negative(x, /, out=None, *, where=True, casting="same_kind", order="K", dtype=None, subok=True[, signature, extobj]) = <ufunc "negative">
要素ごとに剰余を計算します。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">
要素ごとに剰余を計算します。C 言語の fmod() で計算できる剰余と同じ結果になります。
numpy.fmod(x1, x2, /, out=None, *, where=True, casting="same_kind", order="K", dtype=None, subok=True[, signature, extobj]) = <ufunc "fmod">
サンプルコード
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(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">
要素ごとに商と剰余を同時に計算します。
numpy.divmod(x1, x2, [out1, out2, ]/, [out=(None, None), ]*, where=True, casting="same_kind", order="K", dtype=None, subok=True[, signature, extobj]) = <ufunc "divmod">
サンプルコード
(array([0, 0, 2]), array([2, 3, 1]))
コメント