如何使用来自不同函数的值有效填充数组?

时间:2017-10-24 18:06:26

标签: python arrays performance numpy

我有一个长度为x的数组n_x,一个长度为all_par1的数组n_par1和一个参数par2。此外,两个函数func1func2将这些参数和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。

1 个答案:

答案 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)