2017-10-24 1 views
0

私は長さがn_xの配列x、長さがn_par1の配列all_par1と単一のパラメータpar2を持っています。さらに、これらのパラメータを取る2つの関数func1func2と入力としてxがあります。さまざまな関数の値を効率的に配列に取り込む方法は?

Iは、列の最初の半分はfunc1の値とfunc2からの値と後半が移入さ寸法n_x X 2 * n_par1持つ配列を作成します。

私は現在、このようにそれを実行します。

import numpy as np 


def func1(x, par1): 
    return x/(par1 + x) 


def func2(x, par1, par2): 
    return -par1 * x/((par2 + x) ** 2) 


def populate_matrix(xvec, par1_vec, par2): 

    first_half = np.stack((func1(xvec, par1_i) for par1_i in par1_vec), axis=1) 
    second_half = np.stack((func2(xvec, par1_i, par2) for par1_i in par1_vec), axis=1) 

    return np.concatenate((first_half, second_half), axis=1) 


np.random.seed(0) 

all_par1 = [1., 2., 3.] 
my_par2 = 5. 

n_x = 2 
x_variable_length = np.random.rand(n_x) 
print x_variable_length 

mat = populate_matrix(x_variable_length, all_par1, my_par2) 

これは、例えば、次に私を与えますn_xとして

[[ 0.35434447 0.21532117 0.15464704 -0.01782479 -0.03564959 -0.05347438] 
[ 0.416974 0.26340313 0.19250415 -0.02189575 -0.0437915 -0.06568725]] 

が2であり、それは2つの行を有し、列の最初の半分は常に正であるfunc1で生成され、常に負であるfunc2の値と後半。

私はこの関数を何度も呼び出す必要があり、これが最も効果的な方法かどうか疑問に思っています。何か案は?

わからないことが重要であるが、実際の寸法は300×100ここで

答えて

1

のようなものが大きなアレイ上の10倍の改善のためのベクター化の方法(テストで100x200)であるかどうか:

def populate_matrix_v(xvec, par1_vec, par2): 
    n,m=xvec.size,par1_vec.size 
    res= np.empty((n,m+m)) 
    res[:,:m]=func1(x_variable_length[:,None],par1_vec) 
    res[:,m:]=func2(x_variable_length[:,None], par1_vec, par2) 
    return res 

In [377]: %timeit matv = populate_matrix_v(x_variable_length, all_par1, my_par2) 
171 µs ± 6.13 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) 

In [378]: %timeit mat = populate_matrix(x_variable_length, all_par1, my_par2) 
1.88 ms ± 61.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 
+0

それはうまく動作し、upvoted(私はしばらくの間、他の何かが表示されるかどうかを確認するのを待つ...) – Cleb

関連する問題