我有一个依赖于某些参数的函数,哪个输出是一个数组。例如:
def my_func(xs,param1,param2,param3):
values = xs**param1 + xs*param2**2 + param3*xs
return values
其中xs是带有值的数组。 Suposse我还有一个每个参数的值列表:
xs = np.arange(0,10,1)
params1 = np.arange(5,10,1)
params2 = np.arange(1,30,1)
params3 = np.arange(1,20,1)
我想为params1,params2和params3的每个可能组合计算my_func的输出。这个想法是能够计算卡方并用输出进行贝叶斯分析。 我知道它可以用嵌套的for循环完成,但我想知道是否可以用mehsgrid完成。我尝试了下面这个,但它打破了:
P1, P2, P3 = np.meshgrid(params1,params2,params3)
results = my_func(xs,P1,P2,P3)
1 def my_func(xs,param1,param2,param3):
----> 2 values = xs**param1 + xs*param2**2 + param3*xs
3
4
5 xs = np.arange(0,10,0.1)
ValueError: operands could not be broadcast together with shapes (100,) (10,10,40)
知道如何做到这一点(如果可以的话)?
修改 @unutbu的答案有效,但我没有关于其输出格式的额外问题。我已经更改了参数范围,因此可以很容易地解释。
将xs
作为np.meshgrid
的参数传递后,results
的形状为
np.shape(results)
(5, 10, 29, 19)
意思是:
axis0是param1
,
axis1是xs
,
axis2是param2
,和
axis3为param3
。
为什么xs
在输出中放入轴= 1?我希望订单能够遵循传递给np.mesgrid
的内容,即xs,param1,param2, param3
。
EDIT2:
抱歉,我刚刚发现np.meshgrid的“索引”键工作。如果有人在我计划使用索引时需要索引,请使用np.meshgrig(arguments,indexing='ij')
。
答案 0 :(得分:1)
将xs
作为参数传递给np.meshgrid
:
import numpy as np
def my_func(xs,param1,param2,param3):
values = xs**param1 + xs*param2**2 + param3*xs
return values
xs = np.arange(0,10,0.1)
params1 = np.arange(1,2,0.1)
params2 = np.arange(1,2,0.1)
params3 = np.arange(1,5,0.1)
X, P1, P2, P3 = np.meshgrid(xs, params1, params2, params3, sparse=True, indexing='ij')
my_func(X, P1, P2, P3)