ループを回さずに複数の函数に一斉に同じ引数を渡す / numpy.frompyfunc()

numpy に用意されている函数はユニバーサル函数であるので、引数として渡された排列に含まれている複数の値が一斉に処理される。numpy に用意されていない函数 (自作函数を含む) であっても numpy.frompyfunc() を使えばユニバーサル函数に変換できる。明示的にループを回さずに済むというだけであって、必ずしも速くなるとは限らない。
 
ここでは逆に、同じ引数を複数の函数で一斉に処理することを考える。
 
numpy.frompyfunc() の構文は次のとおりである。
構文: numpy.frompyfunc( ユニバーサル化される函数, 引数の数, 返値の数 )
返値: ユニバーサル化された函数

import numpy as np

# この 4 つの函数に一斉に同じ引数を渡すことを考える。
Funcs = np.array([lambda x,y : x+y,
                  lambda x,y : x-y,
                  lambda x,y : x*y,
                  lambda x,y : x/y])

# この値を引数として渡すことにする。
Args = np.array([30, 20])


# 1. 普通にループを回して順番に引数を渡す場合
def multFuncs1ArgFor(funcs, args):
    sol = []
    for func in funcs:
        sol.append( func(*args) )
    return sol
print(  multFuncs1ArgFor(Funcs, Args)  )


# 2. ループを回したくない場合は numpy.frompyfunc() を使って
#   「函数に引数を渡す函数」をユニバーサル函数化する。
multFuncs1ArgNP = np.frompyfunc(lambda func, *args: func(*args),
                                len(Args)+1, 1)
print(  multFuncs1ArgNP(Funcs, *Args)  )

実行結果:
f:id:ti-nspire:20180411131639p:plain