我有一个列表(实际上我想使它成为一维numpy数组),其第一个和最后一个元素将保持不变但其他元素是优化的对象,即经常更改并需要在一个单独的变量(因为scipy.optimize.leastsq()
需要它)。
所以我已经有了这个代码来放置常数"外部"元素和不断变化的元素:
b_0 = 1 # this will stay constant
b_n = 10 # this as well
def _b(b_0, b_n, b_in):
import numpy as np
b = np.zeros((b_inner.shape[0]+2))
b[0] = b_0
b[-1] = b_n
b[1:-1] = b_in
return(b)
>>> b_in = range(2,10)
>>> _b(b_0, b_n, b_in) #returns array([1,2,3,4,5,6,7,8,9,10])
这对我来说看起来非常不优雅,而且我确信必须有一种方法可以在一行中定义
b = np.array([b_0, somefunction(b_in), b_n])
对于背景,我需要这个,因为我有一个带有1D数组的minimalsq的错误函数,其中只有内部元素被优化。我将上面的结果与lambda函数一起提供给错误函数的其他参数,这样我只能传递更改为leastsq的东西:
err_func = lambda b_in: error_function(_b(b_0,b_n,b_in), other_parameters)
b_in_0 = range(2,10) # starting guess
target = scipy.optimize.leastsq(err_func, b_in_0)
因为我对不同类型的优化使用相同的错误函数(函数可以适应不同的方面和不同类型的约束),我不想为特定目的重写错误函数
答案 0 :(得分:2)
我认为np.r_
可能是您正在寻找的。您可以使用np.r_[b_0, somefunction(b_in), b_n]
,例如:
np.r_[12, np.arange(5), 13]
# array([12, 0, 1, 2, 3, 4, 5, 13])