为每个网格点计算值数组
我有一个函数,这个函数需要一些参数,然后输出一个数组。比如说:
def my_func(xs,param1,param2,param3):
values = xs**param1 + xs*param2**2 + param3*xs
return values
这里的xs是一个包含值的数组。假设我还有每个参数的值列表:
xs = np.arange(0,10,1)
params1 = np.arange(5,10,1)
params2 = np.arange(1,30,1)
params3 = np.arange(1,20,1)
我想要计算my_func在params1、params2和params3的每种可能组合下的输出。这样做的目的是为了能够计算卡方值,并用输出结果进行贝叶斯分析。我知道可以用嵌套的for循环来实现,但我在想是否可以用meshgrid来做。我试过以下的方法,但出现了问题:
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
放在axis=1的位置?我本来以为顺序应该和传给np.meshgrid
的顺序一致,也就是xs,param1,param2,param3
。
编辑2:
抱歉,我刚刚发现了np.meshgrid的“indexing”关键字。如果有人需要像我一样使用索引,可以用np.meshgrid(arguments,indexing='ij')
。
1 个回答
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)