簡體   English   中英

如何用來自不同函數的值有效地填充數組?

[英]How to efficiently populate an array with values from different functions?

我有一個數組x長度的n_x ,陣列all_par1長度的n_par1和單個參數par2 此外,兩個函數func1func2將這些參數和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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM