ndarrayでは、要素ごとに関数を適用するユニバーサル関数(Universal function ufunc)を使い、関数による操作を配列要素全てに一括して適用することができる。

まずは簡単な例から見ていこう。

引数が一つだけの単項ufunc

まずは引数に一つのndarrayを取る単項ufuncから見てみる。

import numpy as np

arr = np.arange(10)
np.sqrt(arr)

# array([0.        , 1.        , 1.41421356, 1.73205081, 2.        ,
#        2.23606798, 2.44948974, 2.64575131, 2.82842712, 3.        ])

与えられた引数の平方根を返すsqrt関数の例だ。

引数にndarrayを与えると、arr配列の全要素に対しsqrt関数の処理が行われ、ndarrayとして結果を得ることができる。

引数が二つある二項ufunc

次は引数を二つ取る二項ufuncの例だ。

import numpy as np

x = np.random.randn(5)
y = np.random.randn(5)

print(x)
# [-2.03782879 -0.54059089 -0.37886326 -1.87207276  1.17470752]

print(y)
# [ 1.18661992  1.48746241 -0.8603871   1.06145979 -0.50564704]

np.maximum(x, y)
# array([ 1.18661992,  1.48746241, -0.37886326,  1.06145979,  1.17470752])

今回はmaximum関数を使ってみた。

maximum関数は引数に与えられた値を比較し、最も大きな値を返す関数だ。

引数に二つのndarrayを与えると、それぞれの要素を比較し、最も大きな値で構成されたndarrayを返すことになる。

複数のndarrayを返すufunc

ufuncの中には、複数のndarrayを返す珍しい関数もある。

import numpy as np

arr = np.random.randn(5) * 5
print(arr)
# [-2.23550844  0.06256962 -0.27480015  7.04715469  3.02665762]

x, y = np.modf(arr)

print(x)
# [-0.23550844  0.06256962 -0.27480015  0.04715469  0.02665762]

print(y)
# [-2.  0. -0.  7.  3.]

modf関数はその一例で、引数に与えたndarrayの要素を整数と小数に分けて、二つのndarrayを返すことができる。

この例の場合、modf関数によりxとyにそれぞれ小数部分のndarrayと、整数部分のndarrayを代入している。

まとめ

今回紹介したユニバーサル関数はほんの一例だが、ndarrayとの連携で強力な計算を素早く行うことができることが分かっただろう。

ここで紹介したufunc以外にも数多くの関数が用意されているので、ndarrayを使ったプログラミングをする際は、一度ググって調べてみると良い。