[英]How to efficiently populate an array with values from different functions?
我有一個數組x
長度的n_x
,陣列all_par1
長度的n_par1
和單個參數par2
。 此外,兩個函數func1
和func2
將這些參數和x
作為輸入。
我想創建一個尺寸為n_x
x 2 * n_par1
,其中列的前半部分填充有func1
的值,后半部分填充有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]]
由於n_x
為2,它具有兩行,因此列的前半部分由func1
生成,該函數始終為正,而后半部分的func2
值始終為負。
我需要多次調用此函數,我想知道這是否是最有效的方法。 有任何想法嗎?
不確定是否感興趣,但實際尺寸約為300 x 100。
這是將大型陣列(測試中為100x200)提高10倍的向量化方法:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.