我有一个长度为x
的数组n_x
,一个长度为all_par1
的数组n_par1
和一个参数par2
。此外,两个函数func1
和func2
将这些参数和x
作为输入。
我想创建一个维度为n_x
x 2 * n_par1
的数组,其中列的前半部分填充了func1
的值,后半部分的值填充了{{ {1}}。
我目前这样做:
func2
这给了我,例如
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)
当[[ 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时,它有两行,前一半的列是n_x
生成的,始终为正,后半部分的值为func1
,总是为负
我需要多次调用此函数,我想知道这是否是最有效的方法。有什么想法吗?
不确定是否感兴趣,但实际尺寸大约为300 x 100。
答案 0 :(得分: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)